Почему я не могу присвоить значения переменной внутри именованного функционального выражения с тем же именем?
-
21-12-2019 - |
Вопрос
Это именованное функциональное выражение с именем test
.Внутри я назначаю 123
к переменной, также названной test
.Тогда test
регистрируется.Функция печатает свое тело в консоли, но не 123
.В чем причина такого поведения?
(function test() {
test = 123;
console.log( test );
}());
Где мое объяснение выполнения функции терпит неудачу?
- Начало выполнения функции:
test
это локальная переменная, которая ссылается на саму функцию - Локальная переменная
test
переназначается на номер123
console.log(test)
показывает номер123
.
Решение
Я верю, что эта часть спецификация ecma объясняет такое поведение.Это относится конкретно к названный Функциональные выражения
Производство
Функциональное выражение :идентификатор функции ( FormalParameterListopt ) { FunctionBody }
оценивается следующим образом:
- Пусть funcEnv является результатом вызова NewDeclarativeEnvironment, передающего лексическую среду текущего контекста выполнения в качестве аргумента
- Пусть envRec - запись среды funcEnv.
- Вызовите метод CreateImmutableBinding concrete из envRec, передающий строковое значение Identifier в качестве аргумента.
- Пусть закрытие является результатом создания нового объекта Function, как указано в 13.2, с параметрами, указанными в FormalParameterListopt, и телом, указанным в FunctionBody .Передайте в funcEnv в качестве области видимости.Передайте значение true в качестве флага Strict, если функциональное выражение содержится в строгом коде или если его FunctionBody является строгим кодом.
- Вызовите метод InitializeImmutableBinding concrete из envRec, передающий строковое значение Identifier и closure в качестве аргументов.
- Обратное закрытие.
Использование CreateImmutableBinding
при создании области видимости именованного функционального выражения создается идентификатор (в данном случае test
) как неизменяемая переменная.Вот почему присвоение ему не изменяет его значения.