2010-10-20 4 views
5

Я хочу добавить некоторые дополнительные параметры в API API геокодирования Google, поскольку я запускаю его в цикле, но не знаю, как добавить параметры закрытия к их анонимной функции который уже имеет параметры по умолчанию, которые передаются при вызове API.Присоединение параметров с закрытием javascript к параметрам по умолчанию в анонимных функциях

Например:

for(var i = 0; i < 5; i++) { 
    geocoder.geocode({'address': address}, function(results, status) { 
     // Geocoder stuff here 
    }); 
} 

Я хочу, чтобы иметь возможность использовать значение I в пройденном geocoder.geocode() анонимная функция, но если бы я имел замыкание с помощью }(i)); на линии 4, например, что заменит первый параметр, который разрушит геокодер.

Есть ли способ, которым я могу использовать закрытие, или передать значение i в анонимную функцию вообще?

Эффективно то, что я хочу сделать, это:

geocoder.geocode({'address': address}, function(results, status, i) { 
    alert(i); // 0, 1, 2, 3, 4 
}(i)); 

но работает :-)

ответ

11

Вы можете получить доступ к i непосредственно от вас анонимной функции (через закрытие), но вам нужно зафиксировать его, чтобы каждый вызов geocode получил свою собственную копию. Как обычно в javascript, добавление другой функции сделает трюк. Я переименовал внешнюю переменную i, чтобы сделать ее более ясной:

for(var iter = 0; iter < 5; iter++) { 
    (function(i) { 
     geocoder.geocode({'address': address}, function(results, status) { 
      // Geocoder stuff here 
      // you can freely access i here 
     }); 
    })(iter); 
} 
+0

Еще более простое решение! Должен был опубликовать скорее – WheresWardy

+1

Я собирался сказать, что это путано, когда я 'i' во внешней области и внутренней области, но я вижу, что вы исправили это сейчас, поэтому я отпущу вас :) – Skilldrick

+0

Я предлагаю, чтобы это пример лучше, потому что другие (они проще) не работают в моем случае: i внутри функции обратного вызова геокодера всегда является последней в цикле. Я думаю, это зависит от асинхронности браузера. Но этот ответ работал отлично! +1! – Igor

3
function geoOuter(i) { 
    geocoder.geocode({'address': address}, function(results, status) { 
     // Geocoder stuff here 
     // This has access to i in the outer function, which will be bound to 
     // a different value of i for each iteration of the loop 
    }); 
} 

for(var i = 0; i < 5; i++) { 
    geoOuter(i); 
} 

Oughta это сделать ...

+0

Такой простой ответ. Большое вам спасибо :-) – WheresWardy