Veuillez voir mon exemple:

var AbcVar = "abc";

function Abc(AbcVar){
  console.log(AbcVar);
}

Est-ce de cette mauvaise façon d'autoriser la fonction à accéder à external var?

Pourquoi la sortie de console.log undefined?

1
Iladarsda 4 nov. 2011 à 15:39

4 réponses

Meilleure réponse

Il est temps de rencontrer M. Scoping.

En clair, la portée est une encapsulation de variables (notez qu'en javascript, les fonctions sont aussi des variables.) Maintenant, dans le langage imaginaire que je viens de créer, le caractère { commence une étendue et } la termine , les variables sont définies avec une égalité simple (x = 42 par exemple):

{                                                                    |
    x = 42;                                                          |
    {                                           |                    |
        y = "I'm in an inner scope!";           |                    |
        x == 42; //true                         |                    |
        {                                  |    |                    |
            x == 42;                       |    |                    |
            y == "I'm in an inner scope!"; |    |                    |
                                           | x, y, z are defined     |
            z = "pyramid time!";           |    |                    |
            y = y + "...not";              |    | x, y are defined   | x is defined
        }                                  |    |                    |
        y == "I'm in an inner scope!...not";    |                    |
        //z is not defined                      |                    |
        x = 4;                                  |                    |
    }                                           |                    |
    x == 4;                                                          |
    //y is undefined                                                 |
    //z is undefined                                                 |
}                                                                    |

Javascript a une portée lexicale. En termes simples, les fonctions créent une nouvelle portée:

var x = 42;
(funciton () {
    x === 42;
    var y = 5;
})();
//y is undefined

Maintenant, il y a un endroit supplémentaire où les variables peuvent être créées, et c'est dans les arguments de la fonction. Les deux fonctions suivantes se comportent de la même manière (arguments est un pseudo-tableau contenant les paramètres passés dans la fonction):

function parameterfull(a, b, c) {
    //do stuff with a, b, c
}

function parameterless() {
    var a = arguments[0], b = arguments[1], c = arguments[2];
    //do stuff with a, b, c
}

S'il vous arrive de ne pas passer d'argument, sa valeur sera undefined.

Maintenant, en utilisant votre fonction et la traduction ci-dessus:

var AbcVar = "abc";

function Abc() {
    var AbcVar = arguments[0];
    console.log(AbcVar);
}

Alors maintenant, vous voyez pourquoi AbcVar est (parfois) undefined à l'intérieur de la fonction.


tl; dr Le paramètre de fonction AbcVar remplace la variable globale AbcVar, et puisque vous n'avez pas transmis de valeur à la fonction, c'est undefined (mais uniquement à l'intérieur de la fonction, le AbcVar global reste le même.)

5
Zirak 4 nov. 2011 à 12:18

Si vous exécutez la fonction que vous venez de créer et lui passez votre AbcVar,

console.log(AbcVar);

Il enregistre "abc" comme prévu

Considérez le code suivant

var AbcVar = "abc";

function logVariable(passedIn){
  console.log(passedIn);
}

logVariable(AbcVar);

Qui crée une variable, une fonction pour enregistrer la valeur de la variable, puis passe la variable à l'enregistreur qui l'enregistre dans la console

Si vous remarquez deux lignes sur votre console interactive après avoir exécuté votre fonction d'enregistrement: abc suivi de undefined

console result

La première est la ligne imprimée lorsque vous appelez console.log () et la seconde est la valeur renvoyée par logVariable après l'exécution, qui est undefined en cas de succès.

0
Alec Wenzowski 4 nov. 2011 à 11:58

A l'intérieur de la fonction, AbcVar fera référence au paramètre AbcVar de la fonction. Si vous ne passez aucun paramètre, la valeur sera undefined.

Le paramètre shadows la variable de portée supérieure avec le même nom. Si vous souhaitez y accéder, vous devez supprimer ou renommer le paramètre. Cela dit, vous devriez toujours préférer passer des arguments aux fonctions (si possible).

1
Felix Kling 4 nov. 2011 à 11:57

Salut vous pouvez changer cela en

  var AbcVar = "abc";

        function Abc(bbb){

            console.log(AbcVar);

        }

Vous pouvez accéder à une variable globale externe, si vous écrivez à l'intérieur de la fonction, cela suppose que comme;

var AbcVar = "abc";

            function Abc(var AbcVar){

                console.log(AbcVar);

            }

 so inside funciton AbcVar is new vaiable  and null ,it shadow global AbcVar
0
Muhammed şahsuvaroğlu 4 nov. 2011 à 11:46