2017-10-07 11 views
0

なぜこのコードスニペットは5を出力しますか(範囲チェーンのために期待どおり)?javascriptの 'entity'オブジェクトとfunctionオブジェクトのライフサイクルの違いは何ですか?

let arr = [] 
var firstFunc; 
for(var i = 0; i < 5; i++) { 
    var iterFunc = function() { 
     return function() { 
      return i 
     } 
    } 
    arr.push(iterFunc()) 
} 

console.log(arr[0]()) 

この出力{0}:割り当て論理は、フードの下で何が起こるかメモリ

let arr = [] 
var firstFunc; 
for(var i = 0; i < 5; i++) { 
    var iterFunc = function() { 
     return { 
      a: i 
     } 
    } 
    arr.push(iterFunc()) 
} 

console.log(arr[0]) 

?なぜ 'エンティティ'オブジェクトがクロージャとは対照的に現在の値を保持していますか?

答えて

0

ここではiまたは{a: i}を返信しません。

重要なことは、最初の例では、iterFunc()は関数を返し、iまたは{a: i}が評価された(まだ呼び出されていない)関数の中にあることです。

iには、常にスカラー(不変)値が設定されています。その値は、取得した値です。 (iがオブジェクトであった場合、そのオブジェクトへの参照が返され、その内容が突然変異した場合、その突然変異を見ることができます)。

不変の値であるため、その値を取得します。しかし、あなたが知っている通り、i値が時間的に変化するので、ここでの重要なことは、WHENその値が読み取られます。

あなたが最初の例で表示された場合は、console.log(...)声明の中で、あなたはが意図的にあなたはそれが(iterFunc()によって返された無名の機能)である知っている機能として、それを呼び出していると、その時、i5の値を保持しています。

console.log(arr[0]()) 

によって:もちろん、

arr.push(iterFunc()) 

arr.push(iterFunc()()) 

によって...と:

あなたの最初の例では、あなただけの次の行を変更した場合

console.log(arr[0]) // Same of your second example. 

両方の場合(0)の出力が同じになることがわかります。

+1

すごい説明です!それは私の考えを満たす!ありがとう! –

関連する問題