【问题标题】:Unexpected closure behavior意外的关闭行为
【发布时间】:2012-04-09 22:22:26
【问题描述】:

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

(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?​​​​​​​​​​​​

【问题讨论】:

    标签: javascript closures


    【解决方案1】:

    了解对象和对象引用之间的区别很重要。

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

    这一行:

    kit.core.bar = 'baz';
    

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

    这一行:

    kit.core = null;
    

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

    【讨论】:

      【解决方案2】:

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

      如果您将“getCore()”更改为返回 this.core 而不仅仅是 core,那么您会看到您所期望的。

      【讨论】:

      • 还指出kit.core 不是引用或指针。它是一个值,就像局部变量core是一个值一样
      • Raynos: kit.core 指向 core 本地对象。如果您修改对象,其他对象也会更改。
      • @KarolyHorvath 如果您更改kit.core内容,那么“getCore()”函数将看到更改。但是,如果您只是让 kit.core 引用新的东西,那么(正如 OP 发现的那样)这种关系就会破裂。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2012-05-19
      相关资源
      最近更新 更多