Вы только что наткнулись на «функцию» 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
напрямую относится к объекту и, следовательно, не имеет определенного myname.
person
t3dodson
schedule
26.05.2015