资讯专栏INFORMATION COLUMN

for循环中的闭包问题

cyrils / 897人阅读

摘要:循环控制台打印但是我们希望的结果是原因是,延迟函数的回调会在循环结束时才执行。我们改写一下原因如果作用域是空的,那么仅仅将它们进行封闭是不够的。

for循环:

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

/* 控制台打印:
    6
    6
    6
    6
    6
    6
 */
    

但是我们希望的结果是:

1
2
3
4
5

原因是,延迟函数的回调会在循环结束时才执行。当定时器运行时即使每个迭代中执行的是setTimeout(.., 0),所有的回调函数依然是在循环结束后才会被执行,因此会每次输出一个6 出来。

我们改写一下:

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

原因:如果作用域是空的,那么仅仅将它们进行封闭是不够的。它需要包含一点实质内容才能为我们所用。它需要有自己的变量,用来在每个迭代中储存i 的值:

继续改写:

 for (var i=1; i<=5; i++) {
    (function() {
        var j = i;//保存外部变量
        setTimeout( function timer() {
            console.log( j );
        }, j*1000 );
    })();
}
/*
    1
    2
    3
    4
    5
*/
//代码改进:(将i当参数传进去)
 for (var i=1; i<=5; i++) {
    (function(j) {
        setTimeout( function timer() {
            console.log( j );
        }, j*1000 );
    })( i );
}

总结

当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时
就产生了闭包。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92752.html

相关文章

  • [Javascript实验课]循环中的闭包

    摘要:执行出来的结果是这样的实验发现,无论如何都在最后执行,这证实了我们之前遇到的问题,因为在循环结束才执行,所以回调函数调用的取值必然是循环的最后一次。 前言 https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Closures MDN上描述闭包的章节阐述了一个由于闭包产生的常见错误,代码片段是这样的 for (var i...

    teren 评论0 收藏0
  • 循环中的异步&&循环中的闭包

    摘要:原文链接在这之前先要了解一下循环中和的区别是函数级作用域或者全局作用域,是块级作用域看一个例子循环中的逻辑代码函数下的输出,全局下的不存在现在我们把换为循环中的逻辑代码报错了,不在函数作用域下,当然肯定也不会再全局下因为和的这个区别当然和的 原文链接在这之前先要了解一下 for循环中let 和var的区别 var 是函数级作用域或者全局作用域,let是块级作用域看一个例子 fu...

    Near_Li 评论0 收藏0
  • 前端小知识--从Javascript闭包看let

    摘要:闭包会在父函数外部,改变父函数内部变量的值。立即执行函数立即执行函数,顾名思义,立即会执行的函数,即当读取到该函数,会立即执行。特性使用语句声明一个变量,该变量的范围限于声明它的块中。使用声明的变量,在声明前无法使用,否则将会导致错误。 let和闭包 之前一直模模糊糊记得,let解决了某个闭包问题,想用时又不敢肯定,今天终于遇到这个问题了,那我们就一起来分析一下,什么是let,let有...

    Kross 评论0 收藏0
  • JavaScript中的闭包

    摘要:权威指南第版中闭包的定义函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中成为闭包。循环中的闭包使用闭包时一种常见的错误情况是循环中的闭包,很多初学者都遇到了这个问题。 闭包简介 闭包是JavaScript的重要特性,那么什么是闭包? 《JavaScript高级程序设计(第3版)》中闭包的定义: 闭包就是指有权访问另一个函数中的变...

    Donne 评论0 收藏0
  • 深入理解JavaScript(二):由一道题来思考闭包

    摘要:中所有的事件绑定都是异步编程当前这件事件没有彻底完成,不再等待,继续执行下面的任务当绑定事件后,不需要等待执行,继续执行下一个循环任务,所以当我们点击执行方法的时候,循环早已结束即是最后。 概念 闭包就是指有权访问另一个函数作用域中的变量的函数 点击li标签弹出对应数字 0 1...

    曹金海 评论0 收藏0
  • [ JS 进阶 ] 闭包,作用域链,垃圾回收,内存泄露

    摘要:执行返回的内部函数,依然能访问变量输出闭包中的作用域链理解作用域链对理解闭包也很有帮助。早期的版本里采用是计数的垃圾回收机制,闭包导致内存泄露的一个原因就是这个算法的一个缺陷。 关于闭包,我翻了几遍书,看了几遍视频,查了一些资料,可是还是迷迷糊糊的,干脆自己动手来个总结吧 !欢迎指正... (~ o ~)~zZ 1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权...

    clasnake 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<