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)

 

posted @ 2017-05-21 12:50  不会起名  阅读(109)  评论(0编辑  收藏  举报