Канонический способ сделать это, все еще используя анонимное закрытие, состоит в создании нового анонимного закрытия, которое вызывается немедленно и передает переменную цикла, которая затем возвращает реальный обратный вызов.
Это анонимное закрытие имеет собственную область видимости, которая содержит свои собственные переменные (включая переданный параметр), которые могут переопределять переменные внешнего цикла, например ::
..., success: (function(type) {
return function() {
alert(type);
}
}(type))
type
в скобках снаружи - это переменная цикла. type
в объявлении функции - это параметр , который входит в область нового замыкания. Когда вызывается alert
, он использует тот, который ближе всего по объему, то есть параметр.
Конечно, параметр может иметь свое собственное имя переменной, оно не обязательно должно быть таким же, как во внешней области видимости! Если бы оно было другим, то оба были бы доступны, но версия с внешней областью действия всегда имела бы одно и то же значение.