对js闭包的一点认识

先看一段代码

可能很多人对这段代码无法理解,程序的设计者设计的初衷是想给数组a放置打印下标的function, 可实际执行结果是,数组a里存放的function打印的不是对应的下标,而全都是2!?!? 无法理解? 不要急,等我一步一步的调试下,可能会对你有所帮助呢

1. 下面这段代码相信都没有疑问

2. 这一步

test声明的时候, 此时i=0,但是调用的时候,i已经变成了1

3. 再加一个函数test2, 同时再次i++, 函数内容同样是打印i, 结果是两次打印都是2, 因为这两个函数中的i是同一个值,并且打印时i的值不是声明时的值,而是和调用时的值保持一致。

4. 一样的, 只是把函数存进了数组

5. 然后还是一样的, 只是放进了循环中,但现在, 已经无缝过渡到了开头的那一段

6.  怎么让程序按我们期望的方式输出呢? 一个解决办法是, 将函数嵌套在一个匿名函数里,通过匿名函数来传i值

原因是,通过匿名函数传值后,匿名函数里的v是局部变量,是函数中非公用的活动对象,不会受外面i的影响,因此能够将我们期望的下标值打印出来

结论: 其实这就是一个闭包引起的副作用(该闭包没有外部函数,因为外部函数不是必需的(是不是可以暂称此类闭包为开包openure)), 当前函数的活动对象的活动对象其实就是全局变量对象, 因为没有外部函数, 这个数组里的所有函数共用一个活动对象, 包括a和i, 所有这里的函数共用一个i, 所以每个函数里的i值都是最后一个值2。

欢迎指教和探讨!  www.bonjs.com 

Alex

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 1,429评论 1 5
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,880评论 1 10
  • 我经常思考一个问题:我善良吗? 我不善良! 佛经里讲的很清楚,一切恶业皆由贪嗔痴引起,而贪嗔痴则来源于身语意 身 ...
    老昙阅读 446评论 0 0
  • 2017年1月25日,周三,离放假仅剩了一天时间,公司举办了一场“迎新春”联欢晚会,这是公司历史上第一届大规...
    flower29阅读 736评论 12 2
  • 代码混淆是每个java程序猿的必修课,但是为项目写混淆配置文件是一件痛苦的事情,关键字比较多不太好记忆,而且一旦配...
    祖传大苹果阅读 35,488评论 6 22