tl; dr il est dû à la façon dont les expressions de la fonction et la fonction de travail de déclarations (également, levage de fonction): https://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/
réponse plus détaillée:
Mettre les CONSOLE.LOG suivants est dans le code vous aidera à visualiser ce qui se passe, et je pense répondre à votre question.
var foo = 1;
console.log('0', foo)
function bar() {
console.log('1', foo)
foo = 10;
console.log('2', foo)
return;
console.log('3', foo)
function foo() {}
console.log('4', foo)
}
console.log('5', foo)
bar();
console.log('6', foo)
La sortie est la suivante:
'0' 1
'5' 1
'1' function foo() {}
'2' 10
'6' 1
Alors à vos soupçons, console.log ('3', foo) et console.log ('4', foo) ne sont jamais appelé après la déclaration de retour, qui était attendue. Votre question maintenant est probablement "Pourquoi mon console.log ('1', foo) affecté à la fonction foo() {}", qui peut être répondu par la question suivante SO qui décrit la déclaration de fonction par rapport aux expressions de fonction, c'est-à-dire
function foo(){}
vs
var foo = function(){}
Why can I use a function before it's defined in Javascript?
Fondamentalement quand bar
est exécuté, la définition immédiate de foo
devient function() {}, mais le concept clé ici est cette définition de foo
est locale à l'intérieur de la fonction bar()
, et en dehors de la portée de bar
, il est toujours affecté à 1.
Une autre bonne lecture sur les déclarations de fonctions et les expressions: https://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/
J'ai accepté cela comme la bonne réponse parce que c'est la plus complète. Merci! –
@ MarcinWasilewski Je le reformulerais pour qu'il soit le plus long. –