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

Eva*_*van 16 javascript closures for-loop

我已经在for循环中看到了匿名函数,以便在一两个地方引发Web上的新范围,并且想知道它是否有意义.

例如:

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

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

        // do something with colorAttr
    })();
}
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*yne 32

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

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
Run Code Online (Sandbox Code Playgroud)

即使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
Run Code Online (Sandbox Code Playgroud)

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

  • ohhhhhhhhh 有道理 (2认同)
  • 我知道你写这篇文章已经有一段时间了,但它(仍然)非常有帮助。谢谢!! (2认同)