Javascript Неопределенная переменная переопределена внутри функции
Не могли бы вы помочь мне понять, почему JS работает здесь?
var timer = 3;
var func = function() {
alert(timer);
var timer = 5;
}
func();
Это возвращает меня "неопределенный".
Если я сделаю
var timer = 3;
var func = function() {
alert(timer);
timer = 5;
}
func();
он работает как положено (оповещения 3).
Это что-то с областями, которые я не правильно понял. Не должен ли JS переписать определение "таймер" после предупреждения?
Проверено только на хром.
Спасибо вам, ребята.
2 ответа
var timer = 3;
var func = function() {
alert(timer);
var timer = 5;
}
Этот код становится таким, когда JS интерпретирует;
var timer = 3;
var func = function() {
var timer; // Here local variable timer is undefined
alert(timer); // here local var timer alerts rather than global var timer
timer = 5; // here timer got initialized
}
Это происходит из-за концепции подъема в JavaScript. Вы можете прочитать подъем фром здесь
Перемещение переменных раздражает в том, что javascript 'hoists' (отправляет объявления переменных) в начало текущей области видимости.
Однако он не отправляет инициализации в начало текущей области.
Так:
var timer = 3;
var func = function() {
alert(timer);
var timer = 5;
}
будет выглядеть так:
var timer = 3;
var func = function() {
var timer;
alert(timer);
timer = 5;
}
Когда это интерпретируется.
Подъем - это (для многих разработчиков) неизвестное или игнорируемое поведение JavaScript.
Если разработчик не понимает подъема, программы могут содержать ошибки (ошибки).
Чтобы избежать ошибок, всегда объявляйте все переменные в начале каждой области видимости.
Так как JavaScript интерпретирует код, это всегда хорошее правило.