javascript - 闭包定义在对象中的问题

查看:118
本文介绍了javascript - 闭包定义在对象中的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

看犀牛书关于闭包的相关章节,看到一个关于闭包的问题,对结果不是十分理解

function counter() {
    var n =0;
    return {
        count:function() {return n++;},
        reset:function() {n=0;}
        };
        }
var c = counter(), d = counter();
c.count()                           //0
d.count()                           //0
c.reset()
c.count()
d.count()

对 第二个0不是太理解,为什么同一对象下的方法可以共享一个状态n,另一个对象共享的是另一个状态n,感觉不管哪个对象下方法定义的函数的内部[[scope]]都是一样的,为什么不是一起共享状态n呢?

解决方案

感觉不管哪个对象下方法定义的函数的内部[[scope]]都是一样的。

是不对的。

你要知道,同一个函数,每调用一次,都会生成新的上下文和词法环境。例子里调用了两次,生成的是两个独立的词法环境,以及独立的n。所以c.count和d.count的[[scope]]属性是不同的。

画了一个图:

图中的圆角矩形代表词法环境(global以及每次函数调用时生成的)。

这篇关于javascript - 闭包定义在对象中的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆