Это не проблема закрытия, потому что вы на самом деле не закрываете какие-либо переменные (кроме address
в srPerformGeocode
, но это не имеет значения для вашей проблемы). Подробнее о крышках здесь.
JavaScript передает объекты по ссылке 1 , поэтому вы передаете один и тот же массив во время каждой итерации цикла (и, следовательно, при каждом вызове srPerformGeocode
).
Это нормально, пока не будет выполнен асинхронный обратный вызов & ndash; служба геокодирования называется с параметрами, которые вы видите в первом наборе консольных выходов, но когда обратный вызов выполнен и вы регистрируете «геокодирование ...», вы увидите только AddressObject
как существовал после последней итерации цикла, поскольку цикл завершился очень давно (это очень характерно для асинхронного JavaScript).
Способ решения вашей проблемы - передать каждый вызов srPerformGeocode
a copy массива AddressObject
. Удобно, чтобы у массивов был метод, который возвращает новый массив & ndash; slice
. (splice
только изменяет массив; он не создает новый.)
for (var i = 0; i < AddressObject.addressToArray.length; i++) {
srPerformGeocode(AddressObject.slice(0, -i));
}
(Обратите внимание, что это мелкая копия; то есть любые объекты в массиве по-прежнему указывают на те же объекты, что и исходный массив. Это не имеет значения, поскольку ваш массив полон примитивов.)
Некоторые другие заметки:
String.trim
не существует в IE & le; 8, поэтому ваш вызов address.trim()
вызовет исключение.
- Карты Google на самом деле не выполняют массовое геокодирование; Вы можете получить ограниченную скорость или даже полностью отключиться, если делаете слишком много вызовов геокодирования.
1 Педанты не согласятся с этим утверждением; см. связанный ответ.