Учитывая приемлемую производительность я использовал бы первую, потому что это семантически ближе к намерению.
, Если производительность была проблемой, (Большинство современных оптимизаторов будет probalbly оптимизировать обоих к тому же плану запросов, хотя необходимо протестировать, чтобы проверить, что) тогда, конечно, я использовал бы более быстрый.
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]();
}
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.
Вы можете поместить тело цикла в анонимную функцию:
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, потому что функция вызывается немедленно петля.
Еще один подход, использующий каррирование :
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)));
};
};
Проверьте приведенный выше фрагмент здесь .