Ce phénomène est connu sous le nom de: Levage variable JavaScript .
A aucun moment vous n'accédez à la variable globale de votre fonction; vous n'accédez jamais qu'à la value
variable locale .
Votre code équivaut à ce qui suit:
var value = 10;
function test() {
var value;
console.log(value);
value = 20;
console.log(value);
}
test();
Vous êtes toujours surpris undefined
?
Explication:
C'est quelque chose que chaque programmeur JavaScript rencontre tôt ou tard. En termes simples, les variables que vous déclarez sont toujours hissées au sommet de votre fermeture locale. Ainsi, même si vous avez déclaré votre variable après le premier console.log
appel, elle est toujours considérée comme si vous l'aviez déclarée avant cela.
Cependant, seule la partie déclaration est soulevée; la cession, en revanche, ne l'est pas.
Ainsi, lorsque vous avez appelé pour la première fois console.log(value)
, vous faisiez référence à votre variable déclarée localement, à laquelle rien ne lui est encore assigné; par conséquent undefined
.
Voici un autre exemple :
var test = 'start';
function end() {
test = 'end';
var test = 'local';
}
end();
alert(test);
Que pensez-vous que cela alertera? Non, ne vous contentez pas de lire, pensez-y. Quelle est la valeur de test
?
Si vous avez dit autre chose que start
, vous vous êtes trompé. Le code ci-dessus est équivalent à ceci:
var test = 'start';
function end() {
var test;
test = 'end';
test = 'local';
}
end();
alert(test);
afin que la variable globale ne soit jamais affectée.
Comme vous pouvez le voir, peu importe où vous placez votre déclaration de variable, elle est toujours hissée en haut de votre fermeture locale.
Note latérale:
Cela s'applique également aux fonctions.
Considérez ce morceau de code :
test("Won't work!");
test = function(text) { alert(text); }
ce qui vous donnera une erreur de référence:
Uncaught ReferenceError: le test n'est pas défini
Cela dérange beaucoup de développeurs, car ce morceau de code fonctionne bien:
test("Works!");
function test(text) { alert(text); }
La raison à cela, comme indiqué, est que la partie d'affectation n'est pas hissée. Ainsi, dans le premier exemple, lors de l' test("Won't work!")
exécution, la test
variable a déjà été déclarée, mais la fonction ne lui est pas encore affectée.
Dans le deuxième exemple, nous n'utilisons pas l'affectation de variables. Nous utilisons plutôt une syntaxe de déclaration de fonction appropriée, ce qui permet de hisser complètement la fonction.
Ben Cherry a écrit un excellent article à ce sujet, intitulé à juste titre JavaScript Scoping and Hoisting .
Lis le. Cela vous donnera une image complète en détail.