2015-05-26 3 views
8

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

Почему mynameundefined, а не строка "global"?

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

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

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

+0

Я думаю, вы забыли «var» для глобальной переменной – crc442

+0

Я считаю, что @ crc442 верен. Можете ли вы отправить сообщение об ошибке для подтверждения? – mas4

+0

@ crc442 - я верю, что вы не знаете, что вы говорите о –

ответ

19

Вы только что наткнулся на 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 определены.

+0

это правильный ответ, я ошибся –

+0

Спасибо за объяснение. Это имеет смысл. У меня есть один вопрос. Почему объявление было отделено от назначения в третьей строке функции? – codingpuss

+1

Поднятие @codingpuss не перемещается там, где выполняется присвоение. Это делает только копию необходимых переменных в функции и объявляет их вверху. – t3dodson

3

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

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

+0

Я не думаю, что эта часть вашего ответа точна: «Значит, значение локальной переменной не определено до этой строки ...». Оператор var перемещается в начало в javascript (подъем), поэтому он выполнялся перед любым другим кодом в пределах его оценки (в данном случае, функцией) – codingpuss

0

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

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

-1

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

var myName = "global"; 

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

+0

См. Комментарии к OP – mas4

Смежные вопросы