#沸你不可#
执行以下程序,分别输出什么
for(var i = 0;i<2;i++){
setTimeout(function(){console.log(i)},0) ….①
}

for(var i = 0;i<2;i++){
(function(i){
setTimeout(function(){console.log(i);},0) …②
}(i))
}
A.setTimeout是异步的,定时函数被加入执行队列,等(for循环)主程序运行完毕时,此时再调用定时函数,i的值已经变为2,两次的定时函数都会共用i=2这个值,因此打印2个2
B. js的作用域是链式的,当for循环函数内部的子块有引用的时候是不会销毁的。这里运用了闭包,外层 function(i)保持着对i的引用,因此每次 i的值得以保留,每次调用定时函数内层function都有自己的私有变量值。 因此打印 0 1
展开
评论