J'ai le code suivant, où je déclare une fonction et après celle-ci, une variable portant le même nom que la fonction:
function a(x) {
return x * 2;
}
var a;
alert(a);
Je m'attendais à ce que cela alerte undefined
, mais si je l'exécute, l'alerte affichera ce qui suit:
fonction a(x) {
Retour x * 2
}
Si j'attribue une valeur à la variable (telle que var a = 4
), l'alerte affichera cette valeur (4
), mais sans cette modification, a
sera reconnu comme une fonction.
Pourquoi cela arrive-t-il?
Les fonctions sont un type de objet qui sont un type de valeur .
Les valeurs peuvent être stockées dans des variables (et des propriétés, et transmises comme arguments à des fonctions, etc.).
Une déclaration de fonction:
Une déclaration var
:
Votre déclaration et votre déclaration var
sont levées. Un seul d'entre eux attribue une valeur à la variable a
.
En JavaScript, déclaration de fonction} _ et déclarations de variable sont placés en haut de la fonction, s'ils sont définis dans une fonction, ou au sommet du contexte global, s'ils ne font pas partie d'une fonction. Et la déclaration de fonction prime sur les déclarations de variable (mais pas sur l'affectation de variable).
La déclaration de fonction annule la déclaration de variable lors du levage
D'abord, vous déclarez une variable:
var a; // value of a is undefined
Deuxièmement, la valeur de a
est une fonction car la déclaration de la fonction a priorité sur les déclarations de variable (mais pas sur l'affectation de variable):
function a(x) {
return x * 2;
}
Et c'est ce que vous obtenez lorsque vous appelez alert(a);
.
Mais si, au lieu de déclarer une variable, vous affectez une variable: var a = 4;
, la valeur attribuée 4
prévaudra.
Si vous utilisez un nom de fonction comme nom de variable, sa valeur est remplacée par le corps de la fonction. Alors "var a" devient votre fonction "a" et donc votre alerte affiche la fonction "a".
Vous devez également vous rappeler que var a
est hissé, ce qui le rend plus semblable à ceci
var a; // placed
function a(x) {
return x * 2;
};
var a; // removed
alert (a); // a is replaced by function body
N'oubliez pas que var a
est hissé, donc si vous affectez 4 to a
:
var a; // placed
function a(x) {
return x * 2;
};
var a = 4; // removed
a = 4 // added
alert (a); // a is now 4