Почему я не могу присвоить значения переменной внутри именованного функционального выражения с тем же именем?

StackOverflow https://stackoverflow.com//questions/24021489

Вопрос

Это именованное функциональное выражение с именем test.Внутри я назначаю 123 к переменной, также названной test.Тогда test регистрируется.Функция печатает свое тело в консоли, но не 123.В чем причина такого поведения?

(function test() {
  test = 123;
  console.log( test );
}());

Где мое объяснение выполнения функции терпит неудачу?

  1. Начало выполнения функции: test это локальная переменная, которая ссылается на саму функцию
  2. Локальная переменная test переназначается на номер 123
  3. console.log(test) показывает номер 123.
Это было полезно?

Решение

Я верю, что эта часть спецификация ecma объясняет такое поведение.Это относится конкретно к названный Функциональные выражения

Производство

Функциональное выражение :идентификатор функции ( FormalParameterListopt ) { FunctionBody }

оценивается следующим образом:

  1. Пусть funcEnv является результатом вызова NewDeclarativeEnvironment, передающего лексическую среду текущего контекста выполнения в качестве аргумента
  2. Пусть envRec - запись среды funcEnv.
  3. Вызовите метод CreateImmutableBinding concrete из envRec, передающий строковое значение Identifier в качестве аргумента.
  4. Пусть закрытие является результатом создания нового объекта Function, как указано в 13.2, с параметрами, указанными в FormalParameterListopt, и телом, указанным в FunctionBody .Передайте в funcEnv в качестве области видимости.Передайте значение true в качестве флага Strict, если функциональное выражение содержится в строгом коде или если его FunctionBody является строгим кодом.
  5. Вызовите метод InitializeImmutableBinding concrete из envRec, передающий строковое значение Identifier и closure в качестве аргументов.
  6. Обратное закрытие.

Использование CreateImmutableBinding при создании области видимости именованного функционального выражения создается идентификатор (в данном случае test) как неизменяемая переменная.Вот почему присвоение ему не изменяет его значения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top