1、下面这种情况
for(var i=0;i<10;i++){
setTimeout(function(){
console.log(i);
},10);
}
输出为10个10,因为setTimeout函数引用了外部函数的活动对象,它们的引用都是同一个变量i,最后内部函数返回后,i的值为10,此时每个函数都引用着保存变量i的同一个对象,每个i都是10,所以输出10个10.
2、下面这种情况
for(var i=0;i<10;i++){
(function(idx){
setTimeout(function(){
console.log(idx);
},10);
})(i);
}
输出0到9,这种情况通过再创建一个匿名函数,将变量i传入该匿名函数,并用idx变量保存,然后输出,这样可以解决此类问题。
(解决方法可以参考《Javascript高级程序设计》一书的闭包章节)