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
变量版本,当稍后执行该循环中创建的函数时,该变量不会改变.