2017-10-07 4 views
0

Pourquoi cet extrait de code génère-t-il 5 (comme attendu en raison de la chaîne de portées)?Quelle est la différence de cycle de vie entre l'objet 'entity' et l'objet fonction en javascript?

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]()) 

mais cette sortie {a: 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]) 

quelle logique l'allocation mémoire se produit sous le capot? Pourquoi l'objet 'entity' persiste-t-il par rapport à la fermeture?

Répondre

0

Renvoyer i ou {a: i} ici n'a pas d'importance. L'important est que dans le premier exemple, iterFunc() renvoie une fonction et se trouve dans la fonction (non encore invoquée) où i ou {a: i} est évalué.

Avoir i est toujours titulaire d'une valeur scalaire (immuable), cette valeur est ce que vous obtenez en place. (Si i aurait été un objet, une référence à cet objet serait retournée et si, son contenu était muté, vous pourriez voir que les mutations). En tant que valeur immuable, vous obtiendrez cette valeur. Mais, comme vous le savez, i changements de valeur dans le temps, de sorte que la chose clé ici est QUAND cette valeur est lu.

Si vous voyez à votre premier exemple, dans la déclaration console.log(...), vous êtes intentionnellement invoquant comme la fonction que vous savez qu'il est (la fonction sans nom retourné par iterFunc()) et que le temps, i tient une valeur de 5 .

Si, dans votre premier exemple, vous changez simplement la ligne suivante:

arr.push(iterFunc()) 

par

arr.push(iterFunc()()) 

... et, bien sûr:

console.log(arr[0]()) 

par

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

Vous réaliserez que la sortie sera la même dans les deux cas (0).

+1

super explication! ça rencontre mes pensées! Merci! –