تمرير المعلمة إلى وظيفة رد الاتصال
-
12-09-2019 - |
سؤال
رمز بلدي
// قم بطلب 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
تقديم نطاق جديد.
جافا سكريبت 1.7 لديه 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);
}
}
لا تنتمي إلى StackOverflow