Для следующего кода, поскольку я обновил a
с помощью var a
, мое ожидание для alert(a)
должно показать undefined
, но почему оно показывает 4
?
function f(a) {
var a;
alert(a);
}
f(4);
Для следующего кода, поскольку я обновил a
с помощью var a
, мое ожидание для alert(a)
должно показать undefined
, но почему оно показывает 4
?
function f(a) {
var a;
alert(a);
}
f(4);
В JavaScript переменная является глобальной или локальной функцией. Внутри функции нет таких объектов, как вложенные области (если только вы не вставляете одну функцию внутри другой функции).
Указание документов Mozilla JavaScript:
Так как оба параметра функции a
и ваш var a
объявлены в той же области действия, они разрешают одну и ту же переменную.
Смотрите также: Какова область видимости переменных в JavaScript?
Обратите внимание, что поля объектов также могут рассматриваться как еще один уровень охвата - но это не имеет отношения к вашему вопросу.
Кроме того, как указывает торазабуро в его комментарии ниже - В ECMAScript 6 введено ключевое слово let
, которое позволяет создавать истинные вложенные области внутри функций. Однако эта функция достаточно новая, что я изначально не считал ее заслуживающей упоминания (так как пока не очень безопасно использовать в производственном коде). Например, это выглядит как Firefox официально не поддержит новую конструкцию let
до их новой версии в конце этого месяца (январь 2016 г.).
Объявления перемещаются в верхней части своей области в процессе под названием hoisting.
Например:
var a = 5;
var a = 6;
var a;
становится чем-то вроде
var a = undefined;
a = 5;
a = 6;
a;
Следовательно, попытка повторного объявления уже объявленной переменной без использования какого-либо присваивания ничего не делает.
В вашем случае переменная a
уже объявлена как параметр функции. Поэтому var a;
бесполезен. Если вы хотите установить его на undefined, используйте a = void 0;
.