Альтернативный синтаксис для замыканий в Javascript: возможные недостатки?

#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 да, это была шутка, но я был неправ, поэтому быстро отредактировал, чтобы исправить мою ошибку.