js典型题--从闭包开始
一个不起眼的开始
for(var i=0;i<5;i++){ setTimeout(function () { console.log(i) },1000) } console.log(i) //5 5,5,5,5,5
这里涉及到javascript的单线程异步机制,详细介绍见 http://blog.csdn.net/alex8046/article/details/44494859
javascrip是单线程语言,所有异步事件(计时器、鼠标事件、ajax...)在所有时间执行完毕之后才能执行,并且单线程事件几乎在同一时间内执行完毕,因此,在for循环结束后,i已经变为5,而settimeout事件在1秒之后输出5个5。
如果希望输出值变为 5 0,1,2,3,4 改如何进行改进?
1.闭包,将变量保存
for(var i=0;i<5;i++){ (function (j) { //闭包,j=i setTimeout(function () { console.log(j) },1000) })(i) } console.log(i)
2.循环体内进行函数传参,保留变量
var fn=function (i) { setTimeout(function () { console.log(i) },1000) } for(var i=0;i<5;i++){ fn(i) } console.log(i)