#javascript #closures
#javascript #замыкания
Вопрос:
Я все еще сражаюсь со своим низким IQ: D Это обычный печально известный цикл с замыканиями:
function r(){
var a = [];
var i;
for(i=0;i<10;i ){
a[i]=(function(x){
return function(){return x;}
})(i);
return a;
}
Теперь мне это совершенно ясно.
Чтобы лучше понять замыкания, я поиграл с кодом и придумал:
function r(){
var a = [];
var i;
for(i=0;i<10;i ){
a[i] = (function(){
var x=i;
return function(){return x;}
})();
}
return a;
}
Мой код полностью эквивалентен?
Merc.
Ответ №1:
Мой код полностью эквивалентен?
ДА.
Я считаю, что второй способ читать немного проще, потому что он избавляет от необходимости заглядывать в конец немедленно выполняемой функции, чтобы узнать, что передано в качестве параметра (не то, чтобы это было большой проблемой для коротких функций, подобных этой), но первый способ более компактный и, вероятно,чаще так…
Ответ №2:
Я думаю, вы их не пробовали, первый даже не работает! Используйте firebug для тестирования вашего кода. Вот версия первого примера, который на самом деле не выдает ошибок:
function r() {
var a = [];
var i;
for (i=0; i<10; i ) {
a[i] = (function (x) {
return function () {
return x;
}
})(i);
}
return a;
}
Итак, после добавления недостающей закрывающей фигурной скобки они эквивалентны, они создают массив функций, которые возвращают числа от 0 до 9, они не создают массив чисел от 0 до 9. Так, например, вызов r()[5]();
возвращает 5 (это шестой элемент массива).
Комментарии:
1. 1 «Кроме того, второй сломан, так что да, они эквивалентны, они оба не работают». lol так сильно.
2. @OliverWeiler да, это была шутка, но я был неправ, поэтому быстро отредактировал, чтобы исправить мою ошибку.