Pilotage variable et fonction de Javascript

David sharif a fait un quiz JS qui ressemble à peu près,

var foo=1; function bar(){ return foo; foo=10; function foo(){} var foo =5; } typeof bar();//? 

Selon moi, les fonctions sont hosties en premier et ensuite variables déclarées à l'intérieur. La forme hostile de la fonction serait quelque chose comme (corrigez-moi si je me trompe)

 var foo=1; function bar(){ function foo(){} var foo; return foo; foo=10; foo =5; } typeof bar();//? 

Pourquoi typeof bar () est-ce que la fonction n'est pas définie?

Est-ce parce que, au moment de l'exécution de la fonction, il trouve le premier foo (qui est une fonction) et revient heureusement sans recherche continue. Ou autre chose?

Appréciez votre temps.

J'ai trouvé la réponse dans le blog David Shariff .

"Copier sans tache de son blog" –

Bien que foo soit déclaré deux fois, nous savons dès le stade de la création que les fonctions sont créées sur l'objet d'activation avant les variables, et si le nom de la propriété existe déjà sur l'objet d'activation, nous ignorons simplement la déclaration.

Par conséquent, une référence à la fonction foo () est d'abord créée sur l'objet d'activation, et lorsque l'interprète arrive à var foo, nous voyons déjà le nom de la propriété foo existe, de sorte que le code ne fait rien et se déroule.

Si cela ressemble au grec, lisez tout le blog

La déclaration des fonctions "ombre" l'instruction var.

Collez ceci dans votre console:

 var foo = function(){} var foo typeof foo 

Voici comment le code "ressemble" à l'interprète après le temps de compilation:

 var bar = function bar(){ var foo = function foo(){} foo return foo; // never reached foo = 10; foo = 5; } var foo; foo = 1 typeof bar();//"function" 

Les déclarations de fonction sont évaluées lors de l'entrée dans la portée, avant qu'un code étape par étape ne soit exécuté. Le nom de la fonction (foo) est ajouté à la portée (techniquement, l'objet variable pour le contexte d'exécution dans lequel la fonction est définie).

Exemple 1

À partir de cet exemple, voir que même nous déclarons foo après la déclaration, nous pouvons encore revenir.

 function bar() { return foo; function foo() {} // this will get initialized before the return statement. } console.log(typeof bar()); // this will be function