【发布时间】:2013-12-28 07:15:08
【问题描述】:
我有两个代码块,我认为它们应该会产生相同的结果:
1.
for(var i=0;i<10;i+=1){
var j=i;
setTimeout(function(){
console.log(j);
},100);
}
2.
for(var i=0;i<10;i+=1){
(function(j){
setTimeout(function(){
console.log(j);
},100);
})(i);
}
但是,正如大多数人所料,第一个记录 9 十次,第二个记录正确地从 0 到 9。
第二个是使用闭包来保存 i 的值。我认为第一个也应该保留价值,因为:
-
var j在每次迭代中创建一个新变量 j。 - 当前的
i值在迭代中分配给这个新的j。 - 这个新的
j然后在同一迭代中绑定到setTimeout的函数。 - 下一次迭代会将新的 j 绑定到该迭代中的函数。
但事实证明,j 绑定到所有迭代的最后一个 i 值。
那么,使用函数参数创建变量和var 有什么区别?
如有错误请指出!提前致谢!
谢谢大家!我不知道javascript只有函数和全局范围!责怪教我这样做的其他语言:P
【问题讨论】:
-
"
var j在每次迭代中创建一个新变量 j" 不。
标签: javascript function scope closures