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 интерпретирует код, это всегда хорошее правило.

Другие вопросы по тегам