Почему переменная, определенная global, не определена?

Привет, ребята, у меня есть простая функция и глобальная переменная.

Почему myname undefined а не строка "global" ?

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

Невозможно ли ссылаться на внешнюю переменную, которая определяется вне области действия этой функции? и в этом глобальная переменная …

И как я могу это исправить, поэтому я не получаю undefined от глобальной переменной?

Вы только что наткнулись на js “feature” под названием hoisting

 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 напрямую и, следовательно, не имеет моего имени.

Внутри функции вы объявляете var myname = "local" . Несмотря на то, что вы делаете это в середине метода, у этой переменной есть область функций, поэтому она принадлежит всей функции, даже над кодом выше.

Таким образом, значение локальной переменной не определено до этой строки и имеет значение после, но никто не касается глобальной переменной.

Причина, по которой первое предупреждение не определено, заключается в том, что вы повторно объявили global как локальную переменную ниже ее в функции. А в javascript, что означает, что из верхней части функции считается локальной переменной.

Под ним ниже, потому что чуть выше предупреждения вы дали ему значение.

Вы забываете «var» в первой строке:

 var myName = "global"; 

Подъем просто означает тот факт, что javascript проходит и устанавливает все переменные, которые инициализируются значением undefined (а не строкой)

Interesting Posts
Давайте будем гением компьютера.