закрытие JavaScript непосредственная оценка [дубликат]

Учитывая приемлемую производительность я использовал бы первую, потому что это семантически ближе к намерению.
, Если производительность была проблемой, (Большинство современных оптимизаторов будет probalbly оптимизировать обоих к тому же плану запросов, хотя необходимо протестировать, чтобы проверить, что) тогда, конечно, я использовал бы более быстрый.

7
задан Anurag 21 May 2010 в 08:04
поделиться

5 ответов

Create an anonymous function which accepts i as a parameter and returns that certain function:

for (var i = 0; i < 3; i++) {
    a.push((function(i) {
        return function() {
            alert(i);
        }
    })(i));
}

for (var j = 0; j < 3; j++) {
    a[j]();
}

Or do something similar: create an anonymous function which accepts i as a parameter to add the function to the array:

for (var i = 0; i < 3; i++) {
    (function(i) {
        a.push(function() {
            alert(i);
        });
    })(i);
}

for (var j = 0; j < 3; j++) {
    a[j]();
}
7
ответ дан 6 December 2019 в 21:17
поделиться
var iterate = (function () {
    var i, j = [];
    for (i = 0; i < 3; i += 1) {
        j.push(i);
        alert(j[j.length - 1]);
    }
}());

You don't need closure to merely output a value. Your code should, however, be contained in a function for object-oriented containment. Functions don't have to be called to be executed.

1
ответ дан 6 December 2019 в 21:17
поделиться

функция (i) {предупреждение (i)

-2
ответ дан 6 December 2019 в 21:17
поделиться

Вы можете поместить тело цикла в анонимную функцию:

var a = [];

for(var i = 0; i < 3; i++) (function(i) {
    a.push(function() { alert(i); });
})(i)

for(var j = 0; j < 3; j++) {
    a[j]();
}

Создавая эту функцию и передавая значение цикла «i» в качестве аргумента, мы создаем новую переменную «i» внутри тела цикла, которая по существу скрывает внешний «i». Замыкание, которое вы помещаете в массив, теперь видит новую переменную, значение которой устанавливается при вызове внешней функции-функции в первом цикле. Это может быть яснее, если мы будем использовать другое имя при создании новой переменной ... Это делает то же самое:

var a = [];

for(var i = 0; i < 3; i++) (function(iNew) {
    a.push(function() { alert(iNew); });
})(i)

for(var j = 0; j < 3; j++) {
    a[j]();
}

Значение «iNew» присваивается 0, затем 1, затем 2, потому что функция вызывается немедленно петля.

Замыкание, которое вы помещаете в массив, теперь видит новую переменную, значение которой устанавливается при вызове внешней функции-функции в первом цикле. Это может быть яснее, если мы используем другое имя при создании новой переменной ... Это делает то же самое:

var a = [];

for(var i = 0; i < 3; i++) (function(iNew) {
    a.push(function() { alert(iNew); });
})(i)

for(var j = 0; j < 3; j++) {
    a[j]();
}

Значение «iNew» присваивается 0, затем 1, затем 2, потому что функция вызывается немедленно петля.

Замыкание, которое вы помещаете в массив, теперь видит новую переменную, значение которой устанавливается при вызове внешней функции-функции в первом цикле. Это может быть яснее, если мы будем использовать другое имя при создании новой переменной ... Это делает то же самое:

var a = [];

for(var i = 0; i < 3; i++) (function(iNew) {
    a.push(function() { alert(iNew); });
})(i)

for(var j = 0; j < 3; j++) {
    a[j]();
}

Значение «iNew» присваивается 0, затем 1, затем 2, потому что функция вызывается немедленно петля.

0
ответ дан 6 December 2019 в 21:17
поделиться

Еще один подход, использующий каррирование :

var a = [];
var f = function() {
    for (var i = 0; i < 3; i++) {
        a.push((function(a){alert(a);}).curry(i));
    }
    for (var j = 0; j < 3; j++) {
        a[j]();
    }
};

// curry implementation
Function.prototype.curry = function() {
  var fn = this, args = Array.prototype.slice.call(arguments);
  return function() {
    return fn.apply(this, args.concat(
      Array.prototype.slice.call(arguments)));
  };
};

Проверьте приведенный выше фрагмент здесь .

6
ответ дан 6 December 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: