这个问题已经在这里有一个答案:
- JavaScript的闭包内环路-简单实用的例子 43个回答
请看下面的Javascript代码:
var a = [];
var f = function() {
for (var i = 0; i < 3; i++) {
a.push(function(){alert(i)});
}
for (var j = 0; j < 3; j++) {
a[j]();
}
};
警报打印出“3”的所有三次。 我想不同的行为 - 在每次循环生成打印i的当前值的函数。 即3个功能打印不同的指数。
有任何想法吗?
创建它接受一个匿名函数i
作为参数并返回该特定功能:
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]();
}
或者做类似的事情:创建,它接受一个匿名函数i
作为参数传递给函数添加到阵列中:
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 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)));
};
};
检查上面的代码运行在这里 。
var iterate = (function () {
var i, j = [];
for (i = 0; i < 3; i += 1) {
j.push(i);
alert(j[j.length - 1]);
}
}());
您不必封仅仅输出值。 您的代码应该,但是,包含在面向对象的遏制功能。 函数没有被调用执行。
你可以把你的循环体中的匿名函数:
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”。 你推到阵列上的封闭件现在看到的新的变量,其值的当外函数函数被调用在第一回路被设置。 如果我们使用不同的名称,当我们创造了新的变量,这可能是更清楚...这做同样的事情:
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。