#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/