web-dev-qa-db-fra.com

Que se passe-t-il lorsque le nom de la variable JavaScript et le nom de la fonction sont identiques?

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?

8
joesid

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:

  • Crée une fonction nommée
  • Crée une variable dans l'étendue actuelle avec le même nom que la fonction (sauf si une telle variable existe déjà)
  • Assigne la fonction à cette variable
  • Est hissé

Une déclaration var:

  • Crée une variable dans l'étendue actuelle avec le nom spécifié (sauf si une telle variable existe déjà)
  • Est hissé
  • N'assigne pas de valeur à cette variable (sauf si combiné avec un opérateur d'affectation)

Votre déclaration et votre déclaration var sont levées. Un seul d'entre eux attribue une valeur à la variable a.

12
Quentin

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.

5
Yosvel Quintero

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".

2
Rahul Agrawal

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
2
akinjide