Путаница в определении области видимости Javascript

#javascript

#javascript

Вопрос:

Я не смог найти точного соответствия по моей проблеме, хотя существует много вопросов, касающихся области видимости javascript. Вот мой текущий код для вопроса.

 var my_var = "blank";
var MyFunc = function() {
    my_var = "one";
    //var my_var = "two";
}
alert(my_var);
MyFunc();
alert(my_var);
  

Когда я запускаю это, я получаю предупреждение с «пустым», а затем «один», как и ожидалось. Однако, если я раскомментирую эту одну строку, это будет выглядеть так.

 var my_var = "blank";
var MyFunc = function() {
    my_var = "one";
    var my_var = "two";
}
alert(my_var);
MyFunc();
alert(my_var);
  

Я получаю предупреждение с «пустым», а затем «пустым». Это не то, что я ожидал бы, и меня смущает, что добавление строки приведет к удалению поведения. Кто-нибудь может объяснить, что здесь происходит? Я вижу такое поведение как в Firefox, так и в Safari.

Комментарии:

1. Еще одна веская причина, по которой использование локальных переменных с тем же именем, что и глобальные переменные, просто нарывается на неприятности.

Ответ №1:

Все var операторы эффективно «поднимаются» до вершины их заключающей функции (вроде). Таким образом, тот факт, что у вас есть var my_var где-либо в этой функции, означает, что все упоминания «my_var» относятся к локальной переменной.

(Я сказал «вроде», потому var что часть присваивания инструкции не сдвинута; просто объявление, что идентификатор должен быть локальной переменной.)

Комментарии:

1. Чтобы закончить ваше предложение. Подъем создает my_var локальную переменную внутри всей функции.

2. Спецификация делает это довольно понятным. Раздел 12.2. В спецификации говорится о том, что переменные «создаются», и это часть «подъема».

3. также смотрите adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting . 1

4. Вот одно из описаний подъема (есть много других с поиском в Google): net.tutsplus.com/tutorials/javascript-ajax /…

Ответ №2:

Причина в том, что объявления в JavaScript отображаются в области видимости функции. Подробнее об этом читайте здесь .

Ответ №3:

Переменные Javascript имеют область действия функции, в отличие от C, C , Java и C #, которые имеют область действия блока (фигурная скобка).

Краткий совет: объяснен подъем JavaScript

http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/