Salut les gars ici, j'ai une fonction simple et une variable globale.
Pourquoi
myname
undefined
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?
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.
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.
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.