web-dev-qa-db-fra.com

Pourquoi une variable définie globale est-elle indéfinie?

Salut les gars ici, j'ai une fonction simple et une variable globale. 

Pourquoi mynameundefined et non la chaîne "global"?

var myname = "global"; // global variable
function func() {
    alert(myname); // "undefined"
    var myname = "local";
    alert(myname); // "local"
}
func();

N'est-il pas possible de faire référence à une variable externe définie en dehors de la portée de cette fonction? et en cela une variable globale ...

Et comment je peux résoudre ce problème afin de ne pas obtenir une undefined à partir d'une variable globale? 

15
J Rod

Vous venez de trébucher sur une "fonctionnalité" js appelée levage

var myname = "global"; // global variable
function func() {
    alert(myname); // "undefined"
    var myname = "local";
    alert(myname); // "local"
}
func();

Dans ce code, lorsque vous définissez func, le compilateur examine le corps de la fonction. Il voit que vous déclarez une variable appelée myname.

JavascriptHoistsdéclarations de variable et de fonction, en déplaçant la déclaration en haut de la fonction. 

En raison de hisser votre code est réécrit à la suivante.

var myname = "global"; // global variable
function func() {
   var myname; //declare local variable and assign it undefined
   alert(myname); // "undefined"
   myname = "local"; // assign local var myname to "local"
   alert(myname); // "local"
}
func();

Ceci "couvre" la variable globale. Si vous souhaitez accéder à la variable globale dans l'étendue d'une fonction, utilisez le mot clé this.

var myname = "global"; // global variable
function func() {
    var myname = "local";
    alert(this.myname); // "global"
    alert(myname); // "local"
}
func();

Notez que cela ne fonctionne que lorsque vous appelez une fonction, ni une méthode ni un constructeur, car le mot clé this modifie ce qui lui est lié en fonction de la manière dont vous appelez une fonction.

EDIT: Pour être complet

Si vous souhaitez accéder aux variables globales dans n'importe quel contexte, quel que soit le type de fonction, déclarez une variable globale que vous ne couvrez jamais par convention.

var global = this; // in global scope.
var myname = "global";
var obj = {f: function () {
    var myname = "local";
    console.log(global.myname);
}};
obj.f(); // "global"

Notez que ceci est en position de la méthode et que le mot clé this fait directement référence à obj et que, par conséquent, myname n'est pas défini.

34
t3dodson

Dans une fonction, vous déclarez var myname = "local". Même si vous le faites au milieu de la méthode, cette variable a la portée de la fonction, de sorte qu'elle appartient à la totalité de la fonction, même au code situé au-dessus.

Donc, la valeur de la variable locale est indéfinie avant cette ligne et a une valeur après, mais aucune ne touche la variable globale.

3
Joe Enos

La raison pour laquelle la première alerte est indéfinie est que vous avez déclaré une nouvelle variable global sous une variable locale située au-dessous de lui dans la fonction. Et en javascript, cela signifie que, du haut de la fonction, elle est considérée comme la variable locale.

Celui ci-dessous fonctionne parce que juste au-dessus de l'alerte vous lui avez donné une valeur.

0
Andrew