我在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,那么这是一个好的做法吗?
答案 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 );
后面的任何值的条目和因此,它的关闭。