gistfile1.txt 下面这一段代码,是前端开发招聘笔试中经常出现的,目的是考察闭包以及setTimeout的运行机制。for(var i = 0; i 10; i++){setTimeout(function(){console.log(i);},0);}首先要了解setTimeout的运行
下面这一段代码,是前端开发招聘笔试中经常出现的,目的是考察闭包以及setTimeout的运行机制。
for(var i = 0; i < 10; i++){
setTimeout(function(){
console.log(i);
},0);
}
首先要了解setTimeout的运行机制,他是要等到所有可执行的代码运行完毕以后再执行,所以不管后面的duration是多少,都要等到for循环结束才运行,此时i作为一个全局变量的值为10,因此控制台会打印10个10。
要解决这个问题,有以下几个方案:
一是使用闭包,改变setTimeout的环境变量。
for(var i = 0; i < 10; i++){
f(i);
}
function f(index){
setTimeout(function(){
console.log(index);
},0);
}
二是使用bind(),即当需要运行次函数时,将合适的参数传进去。
for(var i = 0; i < 10; i++){
setTimeout(function(index){
console.log(index);
}.bind(this,i),0);
}
三是使用ES6的新定义变量方法let。
for(let i = 0; i < 10; i++){
setTimeout(function(){
console.log(i);
},0);
}
最后运行的结果就是0到9十个数字。
