2012-04-09 14 views
1

フレームワークの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?​​​​​​​​​​​​ 

答えて

3

オブジェクトとオブジェクト参照の違いを理解することが重要です。

最初に、corekit.coreは同じオブジェクトを参照します。オブジェクト自体への変更は、そのオブジェクトへのすべての参照に反映されます。ただし、参照の1つが変更された場合、他の参照は自動的には変更されません。

この行:

kit.core.bar = 'baz'; 

kit.corecoreによって参照されるオブジェクトを修正します。参照は変更されませんが、オブジェクトは変更されます。これは両方の参考文献に反映されています。

この行:

kit.core = null; 

nullを参照する参照kit.coreを変更まだ元のオブジェクトを参照するcoreを変更しません。オブジェクト自体は変更されません。

2

「getCore()」関数であります"core"という名前のローカル変数を参照し、 "core"という名前のオブジェクトプロパティは参照しません。

this.coreの代わりにcoreを返すように「getCore()」を変更した場合は、期待どおりに表示されます。

+0

また、 'kit.core'は参照またはポインタではありません。ローカル変数 'core'が値であるのと同じように値です – Raynos

+0

Raynos:' kit.core'が 'core'ローカルオブジェクトを指しています。オブジェクトを変更すると、もう一方も変更されます。 –

+0

@KarolyHorvath 'kit.core'の** contents **を変更すると、" getCore() "関数がその変更を見ます。しかし、 'kit.core'を何か新しいものを参照させるだけなら、(OPが発見されると)関係が壊れます。 – Pointy