意外的关闭行为

时间:2012-04-09 22:22:27

标签: javascript closures

我计划在框架im构建中做“扩展点”,我找到了一种方法,我可以如何为扩展提供“核心”,这样它就可以添加功能但不暴露核心对象,它可以任意操纵(我知道提供一个界面是更好的主意)但是,当我在测试(以及学习)时,我想知道为什么会发生这种情况:

(function() {
    var core = {'bar': 'foo'}
    function getCore() {return core;}
    window.kit = {
        core: core,
        getCore: getCore
    }
}());

//initial check
console.log(kit.core)
console.log(kit.getCore());

//change the bar
kit.core.bar = 'baz';

//we will both see 'baz'
console.log(kit.core)
console.log(kit.getCore());

//null the core
kit.core = null;

//this time...
console.log(kit.core)       //core is null on this one
console.log(kit.getCore()); //why is the core still there on this one?​​​​​​​​​​​​

2 个答案:

答案 0 :(得分:3)

理解对象和对象引用之间的区别非常重要。

开始时,corekit.core引用同一个对象。对象本身的任何更改都将反映在对该对象的所有引用中。但是,如果其中一个引用发生更改,则其他引用不会自动更改。

这一行:

kit.core.bar = 'baz';

修改kit.corecore引用的对象。引用不会更改,但对象会更改。这反映在两个参考文献中。

这一行:

kit.core = null;

修改引用kit.core以引用null但不更改core,它仍引用原始对象。对象本身不会改变。

答案 1 :(得分:2)

“getCore()”函数引用名为“core”的局部变量,而不是名为“core”的对象属性。

如果您更改了“getCore()”以返回this.core而不是core,那么您就会看到自己的预期。