我有以下带有预期和实际输出的小代码段。我的问题很简单。为什么要按此顺序打印?以及如何打印预期的输出?
,
预期结果:
0
1
2
0
1
2
实际结果:
0
1
2
3
3
3
这是代码:
var functions = [];
for (var i=0; i<10; i++) {
console.log (i);
functions.push (function () {
console.log (i);
});
};
for (var j=0; j<functions.length; j++) {
functions[j] ();
};
最佳答案
推入数组的函数不会像创建函数时那样记录i
的值,而是在调用该函数时记录i
的值。
一旦第一个循环结束,i
的值就是10
,因此此后调用的任何函数都将记录值10
。
如果要在不同状态下保留i
的值,则可以使用闭包制作该值的副本:
for (var i=0; i<10; i++) {
console.log (i);
(function(){
var copy = i;
functions.push (function () {
console.log (copy);
});
})();
};
局部变量
copy
将获取i
的值并保留该值。您还可以将值作为参数传递给函数:for (var i=0; i<10; i++) {
console.log (i);
(function(copy){
functions.push (function () {
console.log (copy);
});
})(i);
};
关于javascript - javascript函数中的var作用域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12903969/