Да, параметры подняты.
Когда функция вызывается, каждое объявление в теле функции (var
, let
, const
и объявления функций) создается в записи среды для этого выполнения контекст. Каждый формальный параметр также добавляется в запись среды таким же образом ([9.2.10 21. c .i и 9.2.10 28.ei2]). Полный процесс описан в разделе 9.2.10 spe c.
Формальные параметры и объявления функций инициализируются (примечание: не «создаются») во время абстрактной операции, называемой FunctionDeclarationInstantiation . Все другие привязки инициализируются во время оценки тела функции.
Это означает, что формальные привязки параметров добавляются в то же логическое место таким же образом, что и объявления тела функции ie. var
, let
, const
и объявления функций ( все из которых, кстати, подняты ). И это означает, что привязки формальных параметров инициализируются так же, как объявления функций (ie. Их соответствующее значение устанавливается в верхней части функции).
Подъем - это функция времени и места создания привязки идентификатора. Формальные привязки параметров создаются (и инициализируются) так же, как объявления функций. Мы знаем, что объявления функций поднимаются, поэтому привязки параметров поднимаются. QED.
До ES2015 этот подъем был, насколько я знаю, невидимым, потому что параметры функции уже находятся на самом верху функции. Однако в ES2015 был добавлен синтаксис инициализатора значения параметра по умолчанию, что сделало подъем видимым в пользовательском пространстве.
Если формальные параметры не были подняты, следующий код не будет выдавать "Uncaught ReferenceError: Cannot access 'x' before initialization"
, потому что по умолчанию значение параметра для z
будет относиться к внешнему x
:
var x = 'global'
(function(y, z = x, x) {}()) // "Uncaught ReferenceError: Cannot access 'x' before initialization"
В вашем комментарии говорится, что ' при условии, что параметры подняты, x
будет [инициализирован как] «undefined», и в результате ошибка не будет происходит, поскольку x
уже инициализировано '. Вы подразумеваете, что подъем может также использоваться для объяснения отсутствия ошибки. Это верно, , но из этого не следует, что, если наблюдается ошибка, подъем не может происходить . Действительно, мы можем видеть, что подъем происходит, потому что, как указано в сообщении об ошибке, x
в z = x
используется для ссылки на формальный параметр x
, который объявлен позже в тексте программы. Это возможно только в случае подъема.