当前位置 : 主页 > 网络编程 > JavaScript >

解决setTimeout的for循环问题

来源:互联网 收集:自由互联 发布时间:2021-06-28
gistfile1.txt 下面这一段代码,是前端开发招聘笔试中经常出现的,目的是考察闭包以及setTimeout的运行机制。for(var i = 0; i 10; i++){setTimeout(function(){console.log(i);},0);}首先要了解setTimeout的运行
gistfile1.txt
下面这一段代码,是前端开发招聘笔试中经常出现的,目的是考察闭包以及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十个数字。
网友评论