Переменная в теле функции и сама функция имеют одинаковое имя (JavaScript)

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

Эта функция печатает его тело в консоли, но не '123'. В чем причина такого поведения?

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

  1. начало выполнения функции; 'test' - это локальная переменная, которая ссылается на саму функцию;
  2. локальная переменная 'test' переназначена на номер 123;
  3. переменная console.log 'test', которая является числом.
7 голосов | спросил Roman Belyaev 3 J0000006Europe/Moscow 2014, 21:33:55

1 ответ


0

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

  

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

     

FunctionExpression: идентификатор функции (FormalParameterListopt) {FunctionBody}

     

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

     
  1. Пусть funcEnv будет результатом вызова NewDeclarativeEnvironment, передав в качестве аргумента лексическую среду контекста выполнения
  2.   
  3. Пусть envRec будет записью среды funcEnv.
  4.   
  5. Вызовите конкретный метод CreateImmutableBinding для envRec, передав в качестве аргумента строковое значение идентификатора.
  6.   
  7. Пусть closure будет результатом создания нового объекта Function, как указано в 13.2, с параметрами, указанными в FormalParameterListopt, и телом, определенным в FunctionBody. Перейдите в funcEnv как Scope. Передайте true как флаг Strict, если выражение FunctionExpression содержится в строгом коде или если его FunctionBody является строгим кодом.
  8.   
  9. Вызвать конкретный метод InitializeImmutableBinding для envRec, передав в качестве аргументов значение String идентификатора и замыкание.
  10.   
  11. Возвратное закрытие.
  12.   

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

ответил James Montagne 3 J0000006Europe/Moscow 2014, 22:09:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132