在javascript for循环中使用匿名函数

时间:2012-12-20 17:02:16

标签: javascript for-loop closures

我在for循环中看到了匿名函数,可以在一两个地方引起网络上的新范围,并想知道它是否有意义。

例如:

var attr, colors = ['green','blue','red'];

for ( attr = 0; attr < colors.length; attr++) {
    (function() {
        var colorAttr = colors[attr];

        // do something with colorAttr
    })();
}

我理解它与将for scope保持在for循环内部有关,但在什么情况下这是必要的?如果你需要在for循环中声明一个新的var,那么这是一个好的做法吗?

2 个答案:

答案 0 :(得分:31)

当你有内部函数没有立即执行时,作为循环的一部分。

var i, colors = ['green', 'blue', 'red'];

for (i = 0; i < colors.length; i++) {
    var color = colors[i];
    setTimeout(function() {
        alert(color);
    }, i * 1000);
}

// red
// red
// red

即使var color在循环内,循环也没有范围。实际上,每个循环迭代只使用一个变量。因此,当超时触发时,它们都使用相同的值,即循环设置的最后一个值。

var i, colors = ['green', 'blue', 'red'];

for (i = 0; i < colors.length; i++) {
    (function(color) {
        setTimeout(function() {
            alert(color);
        }, i * 1000);
    })(colors[i]);
}

// green
// blue
// red

这个将每次迭代的值捕获到函数的参数中,该函数创建了一个范围。现在每个函数都获得它自己的color变量版本,当稍后执行该循环中创建的函数时,该变量不会改变。

答案 1 :(得分:2)

你快到了。如果您将<{em>}值传入自我调用函数作为参数,那么它只在您的代码段中有意义。这样,它可以将该变量存储在其自己的范围对象

attr

现在,激活对象分别是词汇环境记录(它们是ES3和ES5范围对象)将具有(function( attr ) { var colorAttr = colors[attr]; // do something with colorAttr })( attr ); 后面的任何值的条目和因此,它的关闭