js典型题--从闭包开始

来源:互联网 发布:js隐藏手机号码中间 编辑:程序博客网 时间:2024/05/18 18:20
一个不起眼的开始

 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)