javascript - 闭包定义在对象中的问题
本文介绍了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屋!
查看全文