문제

내 코드

// ajax 요청을하고 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
    });  

}

이것을 해결하는 방법?

도움이 되었습니까?

해결책

이 시도:

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);
    }
}

이것은 로그입니다 0 에게 9, 원하는대로 감사합니다 with 새로운 범위를 소개합니다.

JavaScript 1.7은 a let 더 좋은 진술이지만 널리 지원 될 때까지 사용할 수 있습니다. with.

그리고 사용 var 변수의 경우.

다른 팁

그만큼 고전적인 폐쇄 문제 다시 파업!

  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));     

이거 한번 해봐

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);
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top