Вы только что наткнулся на JS «особенность» под названием грузоподъемных
var myname = "global"; // global variable
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
В этом коде при определении func
компилятор смотрит на тело функции. Он видит, что вы объявляете переменную с именем myname
.
Javascript Подъемы переменных и функций деклараций, перемещая заявление в верхней части функции.
Из-за поднятия вашего кода переписывается следующее.
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();
Это «охватывает» глобальную переменную. Если вы хотите получить доступ к глобальной переменной в рамках функции, используйте ключевое слово this
.
var myname = "global"; // global variable
function func() {
var myname = "local";
alert(this.myname); // "global"
alert(myname); // "local"
}
func();
Обратите внимание, что это работает только в вызове функции не метод или конструктор, потому что this
ключевое слово меняет то, что его оценка на основе того, как вы вызываете функцию.
EDIT: Для полноты
Если вы хотите, чтобы получить доступ к глобальным переменным в любом контексте, независимо от типа функции, то объявить глобальную переменную, которая по соглашению вы никогда не покрыть.
var global = this; // in global scope.
var myname = "global";
var obj = {f: function() {
var myname = "local";
console.log(global.myname);
}};
obj.f(); // "global"
Обратите внимание, что это находится в положении метода и this
ключевое слово относится к непосредственно OBJ и, следовательно, не имеет MyName определены.
Я думаю, вы забыли «var» для глобальной переменной – crc442
Я считаю, что @ crc442 верен. Можете ли вы отправить сообщение об ошибке для подтверждения? – mas4
@ crc442 - я верю, что вы не знаете, что вы говорите о –