Где расположены аргументы в лексической среде? - PullRequest
6 голосов
/ 14 апреля 2020

Следующий код всегда печатает аргумент, переданный параметру a, независимо от наличия переменной с тем же именем.

Предположительно, потому что идентификаторы параметра связаны с переменными в области видимости отдельно. Где они расположены? Они в лексической среде?

function foo(a, b = () => a) {
  var a = 1
  console.log(b())
}
foo() // undefined
foo(2) // 2

Неужели var объявления попадают в специальную VariableEnvironment , а параметры располагаются в LexicalEnvironment? И let и const избежать конфликта, сделав переопределение ранней ошибкой?

Относительно также:

1 Ответ

2 голосов
/ 14 апреля 2020

В случае, если присутствуют любые значения по умолчанию , для параметров создается отдельная запись среды.

Семантика функций, объявленных в этой позиции, такова, что эта запись среды определяет их локальная сфера Примечание в спецификации c (см. Раздел 28) гласит:

ПРИМЕЧАНИЕ. Для обеспечения того, чтобы замыкания, создаваемые выражениями в формальном списке параметров, были закрыты, необходима отдельная запись среды. не имеют видимости объявлений в теле функции.

Больше от спецификация c:

Когда контекст выполнения установлен для При оценке функции ECMAScript создается новая функция Запись среды, и в этой записи среды создаются привязки для каждого формального параметра. Каждое объявление в теле функции также создается. Если формальные параметры функции не содержат инициализаторов значений по умолчанию, то объявления тела создаются в той же самой записи среды, что и параметры. Если инициализаторы параметров значения по умолчанию существуют, для объявлений тела создается вторая запись среды. Формальные параметры и функции инициализируются как часть FunctionDeclarationInstantiation. Все остальные привязки инициализируются во время вычисления тела функции.

Поэтому при отсутствии аргументов по умолчанию я делаю вывод, что для параметра используется одна из существующих ранее лексических сред (VariableEnvironment или LexicalEnvironment) привязок. Может быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...