翻译 - 深入浅出JavaScript闭包
阿神
阿神 2017-04-10 13:11:11
0
4
490

爱因斯坦曾说过,如果你不能给一个六岁的孩童将清楚什么是闭包,那就证明你自己也不理解。我尝试着去给一个27岁的朋友讲解,但失败了。
如果是你,你会如何去给那些不懂的人讲解闭包的概念(比如函数、变量等)?

原问题:How do JavaScript closures work?

阿神
阿神

闭关修行中......

全部回复(4)
PHPzhong

其实这个问题恼人怪的是发明者没有搞一个图形化的界面说明后面的原理。希望有大神可以解释之,或者说难道js console有这个功能我没去试。我写这个是为了复习下看了权威指南后的心得,写下自己的理解。希望有人指正。
函数是伴随一个定义时的scope chain.然后调用这个函数的时候会增加一个temp invoke chain 1来保存这个嵌套函数的local var + param和它外层的var + param,然后return后就被gc.但是每次调用外层函数的时候都会新生成一个temp invoke chain 2来保存内函数的作用域链,如果被返回值或者存储到其他属性而被引用就不会GC而被保存下来. 于是作用域上外函数的var就被保存下来.

define scope chain 1: { 外函数param + localVar } -> { 内函数param + localVar } -> { globalVar } -> Temp invoke chain 1: { 临时外函数param + localVar } -> { define scope chain 2 } -> { globalVar }
define scope chain 2: { 内函数param + localVar } -> { 外函数param + localVar } -> { globalVar } -> Temp invoke chain 2: { 重定义的内函数param + localVar } -> { 外函数param + localVar } -> { globalVar }

// global variable here
var randomVar = (function() {  //外函数 - define scope chain 1
    var localVar = 0;
    return function() {  //内函数 - define scope chain 2
        return localVar++;
    };
}());  //调用时 - invoke scope chain - 伴随new define scope chain2

randomVar();  // 0
randomVar();  // 1
randomVar();  // 2
randomVar();  // 3

....

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!