码迷,mamicode.com
首页 > Web开发 > 详细

js典型题--从闭包开始

时间:2017-05-21 13:51:55      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:timeout   script   函数传参   class   for   java   pre   .net   并且   

一个不起眼的开始

 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)

 

js典型题--从闭包开始

标签:timeout   script   函数传参   class   for   java   pre   .net   并且   

原文地址:http://www.cnblogs.com/wykbk/p/6884557.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!