var outer = 'outer';

function fn1() {
  var outerString = outer;
  var outer = 'inner';

  console.log( outerString );
  console.log( outer );
}

fn1();

Pourquoi externalString; // indéfini?

2
Byer Gallagher 14 juil. 2015 à 10:00

6 réponses

Meilleure réponse

Trois choses se passent ici:

  1. La var outer à l'intérieur de la fonction masque (masque) la variable outer que vous avez déclarée en dehors de la fonction.

  2. Cela se produit même avant le var outer dans la fonction, car var est hissé en haut de la portée où il est écrit (tout comme les déclarations de fonction).

  3. Lorsqu'une variable est créée, elle commence par la valeur undefined. Ce qui ressemble à une initialisation de variable (var x = 42) n'est en fait qu'une affectation qui se produit plus tard lors de l'exécution de code étape par étape.

Votre code ressemble vraiment à ceci pour le moteur JavaScript:

var outer;                     // Global declaration for `outer`

function fn1() {               // Function declaration for `fn1`
  var outerString;             // Local decl for `outerString`
  var outer;                   // Local decl for `outer`, shadows (hides) the global one
                               // Here, both outerString and outer = `undefined`
  outerString = outer;         // No-op, they're both already `undefined`
  outer = 'inner';             // Give the inner `outer` the value `'inner'`

  console.log( outerString );  // "undefined"
  console.log( outer );        // "inner"
}

outer = 'outer';               // Note this happens after the declarations
fn1();                         // Then you call the function

Plus (sur mon blog) : Pauvre, mal compris var

1
T.J. Crowder 14 juil. 2015 à 07:26

C'est à cause de la variable hébergement, puisque vous avez déclaré la variable à l'intérieur, la variable de portée externe ne sera pas référencé.

Votre code ressemblera à quelque chose

var outer = 'outer';

function fn1() {
  var outer, outerString; //these are declared in the local scope but not yet initialized
  outerString = outer;//now outer has undefined as its value
  outer = 'inner';

  console.log( outerString );
  console.log( outer );
}

fn1();
2
Arun P Johny 14 juil. 2015 à 07:02

Voir les commentaires ci-dessous: Voici comment votre code est exécuté par javascript.

var outer;
    outer = 'outer';

function fn1() {
  var outerString;
  var outer;

  /**** Here outer is declared locally but not defined ****/
  /**** Because you defined var outer inside the function so it takes the local value which is declared but not defined. ****/

  /**** Locally outer variable is defined but your are trying to assign it to outerString before defining it ****/      

  outerString = outer;         // Local variable outer
  outer = 'inner';             // This is the point where you are defining the outer in local scope.


  console.log( outerString );  // Undefined as outerString was assigned a variable which was declared but not defined.
  console.log( outer );        // This was defined locally also hence gives out value.
}

fn1();
0
mechanicals 14 juil. 2015 à 07:12

Les déclarations de variables (et les déclarations en général) sont traitées avant l'exécution de tout code, déclarer une variable n'importe où dans le code équivaut à la déclarer en haut. lire

Formulaire ci-dessus, vous pouvez conclure que outer est undefined tout en définissant outerString.

0
Anoop 14 juil. 2015 à 07:03

Parce que la variable externe est appelée lorsque la chaîne externe est appelée; ce qui signifie que la chaîne externe recherche une variable qui n'existe pas encore.

Changez-le en

Var external = 'inner';

Var externalString = externe;

0
Rajol Kochlashvili 14 juil. 2015 à 07:05

Tout d'abord, supprimez le var externe à l'intérieur de votre fonction, vous déclarez déjà var à l'extérieur donc pas besoin de le refaire. Écrivez juste externe = "intérieur"; et ce sera suffisant.

0
Mikael Sandrènyl 14 juil. 2015 à 07:09