js典型题--从闭包开始

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

 

以上是关于js典型题--从闭包开始的主要内容,如果未能解决你的问题,请参考以下文章

web典型理论题整理JS部分

前端JavaScript基础面试题01_JS基础知识(中)作用域闭包

一道容易栽坑的有趣的面试题(关于js,定时器,闭包等)

从面试题谈谈js的闭包,原型

关于JS闭包

经典js闭包----对《大部分人都会做错的经典JS闭包面试题》的理解