2016-08-10 11 views
0

行動質問配列を変更:ブレース初期化対象外

はなぜNinja.getArrayFromInside()空の配列を返しますか? (後Ninja.arrayの変更は)

let Ninja = (function() { 
 

 
    let array = []; 
 

 
    function getArrayFromInside() { 
 
    return array; 
 
    } 
 

 
    return { 
 
    array, getArrayFromInside 
 
    }; 
 

 
})(); 
 

 
Ninja.array = [1, 2]; 
 

 
console.log(Ninja.getArrayFromInside());
私が思う

、それは... 値または参照渡しについてです(配列は値渡しされるのはなぜではなく、参照することにより?)

ここに同じ質問:

let Ninja = (function() { 
 

 
    let myObject = {}; 
 
    myObject.array = []; 
 

 
    function getArrayFromInside() { 
 
    return myObject.array; 
 
    } 
 

 
    return { 
 
    array: myObject.array, 
 
    getArrayFromInside 
 
    }; 
 

 
})(); 
 

 
Ninja.array = [1, 2]; 
 

 
console.log(Ninja.getArrayFromInside());

答えて

3

最初の例ではarrayという2つの変数があります.getArrayFromInside関数で捕捉された内部スコープ内にlet array = [];と宣言されたものと、Ninja.arrayという2つの変数があります。 これは2つの異なる変数です。最初に参照先はarrayです。 2番目の機能は、ファンクション内のthis.arrayで参照できます。

両方を同じ配列オブジェクト(最初は空です)への参照に初期化します。次に、Ninja.arrayを別のオブジェクトを参照するように割り当てます。配列[1, 2]です。これにより、変数let array ...は変更されません。この関数はlet arrayの値を取得するため、元のまだ空の配列オブジェクトを返します。

Ninja.array = [1, 2];Ninja.array.push(1);Ninja.array.push(2);に変更してみてください。このように元の配列を変更すると、Ninja.getArrayFromInside()呼び出しに変更が反映されます。

+0

ありがとう、超回答:) –

0

最初の例では、arrayは、Ninjaのクラスメンバーではありません。 this.arrayundefinedを返します。

第2の例と同じです。

+0

'Ninja'は実際のクラスではありません。これは単なるブレースで初期化されたオブジェクトです。 'Ninja'は' array'プロパティを持っているので、 'this.array'は' Ninja.getArrayFromInside() '関数呼び出しの中で実際に' [1,2] 'になります – qxz

関連する問題