美文网首页
js 闭包理解-->缺乏形参

js 闭包理解-->缺乏形参

作者: 许道龙 | 来源:发表于2016-07-15 09:02 被阅读0次
for (var i = 1; i <= 5; i++) {
    setTimeout(function timer() {
        console.log(i);
    }, i*1000);
}

解释原因

var i,实际上声明了一个全局变量

延迟函数timer必然是在循环结束后才开始执行,循环结束后,i=6

循环中确实定义了多个延迟函数timer,延迟函数在setTimeout的内部被回调,根据闭包概念,timer在其声明之外的地方被调用,timer能够记住并访问其声明位置的词法作用域,存在闭包

实际上timer所记住的词法作用域就是全局作用域,所以引用输出的i都是6

修改方案

只要能保证每次循环都能够创建新的作用域,在新作用域中保存当前i的值即可

所以任何可以创建新作用域的方法都可以达到效果,具体可参考这里, 通过分析这段代码的进化历程,或许能够加深您对JavaScript的作用域的理解

常见的做法有

利用具名立即执行函数,每次循环都创建新作用域

for (var i = 1; i <= 5; i++) {
    (function scope(j) {
        setTimeout(function timer() {
            console.log(j);
        }, i * 1000);
    })(i);
}

利用es6 let创建块作用域

for (var i = 1; i <= 5; i++) {
    {
      let j = i;
      setTimeout(function timer() {
            console.log(j);
        }, i * 1000);
    }
}

总结:根据闭包的概念,只要有回调就会有闭包

相关文章

  • js 闭包理解-->缺乏形参

    解释原因 var i,实际上声明了一个全局变量 延迟函数timer必然是在循环结束后才开始执行,循环结束后,i=6...

  • 一分钟理解js闭包

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • 一分钟带你弄懂闭包

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • 什么是闭包?几分钟告诉你

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • 一分钟带你弄懂闭包

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • JS闭包入门

    最近有看到朋友的面经里提到的JS闭包的问题,就想研究研究,以下是我对JS闭包的简单理解。 到底什么是JS闭包? 定...

  • JS 闭包(Closure)

    参考阮一峰老师的JS 闭包 理解闭包前需要理解变量作用域、变量提升 JS作用域 那如何让它依次打印,12345呢;...

  • JS闭包理解

    闭包的概念 闭包就是能够读取其他函数内部变量的函数。 一、变量的作用域 要理解闭包,首先必须理解Javascrip...

  • js闭包理解

    什么是闭包简单来说,闭包是指可以访问另一个函数作用域变量的函数,一般是定义在外层函数中的内层函数。 为什么需要闭包...

  • JS闭包理解

    举一个例子来说明闭包: 上述代码中每次执行m(),a的值都会加1。 例子的原理 因为上述代码中当执行A()的时候,...

网友评论

      本文标题:js 闭包理解-->缺乏形参

      本文链接:https://www.haomeiwen.com/subject/uclyjttx.html