2009-11-02 1 views
10

내 코드패스 매개 변수는 콜백 기능

방법이 // 해결하기 위해 아약스 요청을하고 JSON 응답

for (var i = 0; i < data.results.length; i++) { 
    result = data.results[i]; 
    // do stuff and create google maps marker  
    marker = new google.maps.Marker({ 
     position: new google.maps.LatLng(result.lat, result.lng), 
     map: map, 
     id: result.id 
    }); 
    google.maps.event.addListener(marker, 'click', function() { 
     createWindow(marker.id); //<==== this doesn't work because marker always points to the last results when this function is called 
    }); 

} 

를 얻을?

답변

24

이 시도 :

with ({ mark: marker }) { 
    google.maps.event.addListener(mark, 'click', function() { 
     createWindow(mark.id); 
    }); 
} 

with의 사용을 보여줍니다 예 :

for (var i = 0; i < 10; i++) { 
    setTimeout(function() { console.log(i); }, 1000); 
} 

위의 내용은 10 번 열 번 기록됩니다. 원하는

for (var i = 0; i < 10; i++) { 
    with ({ foo: i }) { 
     setTimeout(function() { console.log(foo); }, 1000); 
    } 
} 

이 새로운 범위를 도입 with에, 9 덕분 0를 기록한다.

자바 스크립트 1.7에는 let 문이 더 좋지만, 널리 지원 될 때까지 with을 사용할 수 있습니다.

그리고 귀하의 변수에 var을 사용하십시오.

4

classic closure problem 명이 다시 공격합니다!

google.maps.event.addListener(marker, 'click', function(id) { 
    return function(){ 
     createWindow(id); //<==== this doesn't work because marker always points to the last results when this function is called 
    } 
    }(marker.id));  
1

이 하나

var marker = new Array(); 
for (var i = 0; i < data.results.length; i++) { 
    result = data.results[i]; 
    // do stuff and create google maps marker  
    marker[i] = new google.maps.Marker({ 
     position: new google.maps.LatLng(result.lat, result.lng), 
     map: map, 
     id: result.id 
    }); 
    google.maps.event.addListener(marker[i], 'click', example(marker[i].id)); 

} 

새로운 기능을 만들려고

function example(my_window){ 
    return function(){ 
     createWindow(my_window); 
    } 
}