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

在javascript中为循环使用匿名函数,javascript,for-loop,closures,Javascript,For Loop,Closures,我在for循环中看到了匿名函数,它在一两个地方在web上引入了新的作用域,我想知道它是否有意义 例如: var attr, colors = ['green','blue','red']; for ( attr = 0; attr < colors.length; attr++) { (function() { var colorAttr = colors[attr]; // do something with colorAttr })(

我在for循环中看到了匿名函数,它在一两个地方在web上引入了新的作用域,我想知道它是否有意义

例如:

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

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

        // do something with colorAttr
    })();
}
var attr,colors=[‘绿色’、‘蓝色’、‘红色’];
对于(attr=0;attr

我知道这与保持for循环中的作用域干净有关,但是在什么情况下这是必要的呢?在需要在for循环中声明新var的任何地方都这样做是否是一种好的做法?

您就快到了。如果将
attr
值作为参数传递到自调用函数中,则只有在代码段中才有意义。这样,它就可以将该变量存储在自己的scope对象中


现在,activation对象(分别是ES3和ES5范围对象)将有一个条目,用于输入
attr
后面的任何值,因此,当您拥有作为循环的一部分不会立即执行的内部函数时,它将被关闭

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 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
变量,该变量在以后执行该循环中创建的函数时不会更改。

下面是一个循环中的闭包有意义的示例:
attr
随着循环的进行而更改,因此如果在回调函数中使用
colors[attr]
,它不会引用您实际需要的
颜色[attr]
。我只在等待完成某些操作时使用异步调用。在这种情况下,跟踪
colors[]
更改可能会有问题。因此,如果在内部附加事件处理程序,这样的模式是否更有意义?这不是回调-它是一个立即执行的函数
colorAttr
的作用域是立即执行的函数,但它可以走到父作用域并愉快地访问
attr
。Ohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh。非常感谢。“如果将attr值作为参数传递到自调用函数中,则只有在代码段中才有意义。”IIFE立即执行,将
colors[attr]
存储在
colorAttr
中,无论
attr
值是否作为参数传递。当然,传递参数是一种干净的方法。
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