Переопределенная переменная не успевает

Для следующего кода, поскольку я обновил a с помощью var a, мое ожидание для alert(a) должно показать undefined, но почему оно показывает 4?

function f(a) {
  var a;
  alert(a);
}

f(4);

Ответы

Ответ 1

В JavaScript переменная является глобальной или локальной функцией. Внутри функции нет таких объектов, как вложенные области (если только вы не вставляете одну функцию внутри другой функции).

Указание документов Mozilla JavaScript:

Объем переменной, объявленной с var, представляет собой текущий контекст выполнения, который является либо закрывающей функцией, либо переменными, объявленными вне любой функции, глобальными.

Так как оба параметра функции a и ваш var a объявлены в той же области действия, они разрешают одну и ту же переменную.

Смотрите также: Какова область видимости переменных в JavaScript?


Обратите внимание, что поля объектов также могут рассматриваться как еще один уровень охвата - но это не имеет отношения к вашему вопросу.

Кроме того, как указывает торазабуро в его комментарии ниже - В ECMAScript 6 введено ключевое слово let, которое позволяет создавать истинные вложенные области внутри функций. Однако эта функция достаточно новая, что я изначально не считал ее заслуживающей упоминания (так как пока не очень безопасно использовать в производственном коде). Например, это выглядит как Firefox официально не поддержит новую конструкцию let до их новой версии в конце этого месяца (январь 2016 г.).

Ответ 2

Объявления перемещаются в верхней части своей области в процессе под названием hoisting.

Например:

var a = 5;
var a = 6;
var a;

становится чем-то вроде

var a = undefined;
a = 5;
a = 6;
a;

Следовательно, попытка повторного объявления уже объявленной переменной без использования какого-либо присваивания ничего не делает.

В вашем случае переменная a уже объявлена ​​как параметр функции. Поэтому var a; бесполезен. Если вы хотите установить его на undefined, используйте a = void 0;.