Javascript 意外的关闭行为

Javascript 意外的关闭行为,javascript,closures,Javascript,Closures,我计划在im构建的框架中做“扩展点”,我正在寻找一种方法,如何为扩展提供“核心”,这样它就可以添加功能,但不暴露核心对象,它可以任意操纵(我知道提供接口是更好的主意),但在我测试(以及学习)时,我想知道为什么会发生这种情况: (function() { var core = {'bar': 'foo'} function getCore() {return core;} window.kit = { core: core, getCore:

我计划在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?​​​​​​​​​​​​
“getCore()”函数引用的是名为“core”的局部变量,而不是名为“core”的对象属性

如果将“getCore()”更改为返回
this.core
,而不是只返回
core
,则您将看到预期结果。

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


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

理解对象和对象引用之间的差异非常重要

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

这一行:

kit.core.bar = 'baz';
kit.core = null;
修改由
kit.core
core
引用的对象。引用不会更改,但对象会更改。这反映在两个参考文献中

这一行:

kit.core.bar = 'baz';
kit.core = null;

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

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

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

这一行:

kit.core.bar = 'baz';
kit.core = null;
修改由
kit.core
core
引用的对象。引用不会更改,但对象会更改。这反映在两个参考文献中

这一行:

kit.core.bar = 'baz';
kit.core = null;

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

还注意到
kit。核心
不是引用或指针。它是一个值,就像局部变量
core
是一个值raynos:
kit。core
指向
core
局部对象。如果修改对象,另一个对象也会更改。@KarolyHorvath如果更改
kit.core
的内容,则“getCore()”函数将看到更改。但是,如果您只是让
kit.core
引用新的内容,那么(正如OP发现的那样)关系就被打破了。还需要注意的是
kit.core
不是引用或指针。它是一个值,就像局部变量
core
是一个值raynos:
kit。core
指向
core
局部对象。如果修改对象,另一个对象也会更改。@KarolyHorvath如果更改
kit.core
的内容,则“getCore()”函数将看到更改。但是,如果你只是让kit.core引用了一些新的东西,那么(正如OP所发现的)关系就破裂了。