Я вижу, что этот вопрос с setTimeout()
возникает так часто, и всегда сложно вспомнить правильный синтаксис замыкания, поэтому я подумал, что, возможно, нам следует просто создать служебную функцию setTimeoutWithData()
, которая сделает это действительно простым. Итак, вот оно:
function setTimeoutWithData(rock, fn, t, ctx) {
ctx = ctx || window;
function localFn() {
fn.call(ctx, rock);
}
return(setTimeout(localFn, t));
}
Он принимает четыре параметра и возвращает идентификатор таймера:
rock
Это любая часть данных любого типа, которая будет передана вашему обратному вызову. Если вы хотите передать много данных, вы можете сделать скалу объектом или массивом.
fn
Это ваша функция обратного вызова. В качестве параметра будет передан камень, поэтому ваш обратный вызов должен быть объявлен так: function fn(rock) {}
t
Это значение времени setTimeout в мс, такое же как setTimeout.
ctx
Это единственный необязательный параметр. Если вы хотите, чтобы ваш обратный вызов имел определенное значение this
, вы можете настроить его с помощью параметра ctx. Помимо прочего, это позволяет вам использовать setTimeoutWithData для вызова метода объекта и правильно установить this
, чтобы он легче работал с объектно-ориентированным программированием. Если ctx не передан, то this
будет установлен на window
(так же, как setTimeout).
Итак, проблема в исходном вопросе здесь будет решена так:
for (i in data) {
google.maps.event.addListener(marker, 'mousedown', function() {
state = PINCH;
map.setOptions({draggable: false});
timeoutId = setTimeoutWithData(data[i].id, function(anID) { pickupVenue(anID) }, 1000);
});
}
И вот пример приложения, показывающего эту функцию утилиты в действии: http://jsfiddle.net/jfriend00/3SUAJ/.