gpt4 book ai didi

javascript - JavaScript 中的函数参数是否被提升?

转载 作者:行者123 更新时间:2023-12-01 15:37:14 25 4
gpt4 key购买 nike

function foo(a,b){
return a + b;
}

foo(1,2);


函数参数是否被提升?

函数执行上下文的创建阶段的 variableEnvirnoment 是否看起来像这样:
VE = {
{ 0 : undefined , 1: undefined, length: 2 },
{a : undefined, b: undefined},
outer: refToGlobalLE
}

最佳答案

是的,参数被提升了。

调用函数时,函数体中的每个声明(varletconst 和函数声明)都会在该执行上下文的环境记录中实例化。每个形式参数也以相同的方式添加到环境记录中([9.2.10 21.c.i 和 9.2.10 28.e.i.2])。 section 9.2.10 中描述了完整的过程。的规范。

在称为 FunctionDeclarationInstantiation 的抽象操作期间,形式参数和函数声明都被初始化(注意:不是“实例化”) .所有其他绑定(bind)在函数体的评估过程中被初始化。

这意味着形式参数绑定(bind)以与函数体声明相同的方式添加到相同的逻辑位置,即。 var , let , const , 和函数声明(顺便说一下 all of which are hoisted )。这意味着形式参数绑定(bind)以与函数声明相同的方式初始化(​​即它们的对应值设置在函数的顶部)。

提升是一个标识符绑定(bind)被实例化的时间和地点的函数。形式参数绑定(bind)以与函数声明相同的方式实例化(和初始化)。我们知道函数声明被提升,因此参数绑定(bind)被提升。 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将[初始化为]“未定义”,因此错误不会发生为 x已经初始化'。你的意思是提升也可以用来解释没有错误。这是真的, 但因此并不意味着如果观察到错误,提升就不会发生 .实际上,我们可以看到正在发生提升,因为如错误消息中所述, xz = x取指形式参数 x稍后在程序文本中声明。唯一可能的方法是提升已经发生。

关于javascript - JavaScript 中的函数参数是否被提升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61697774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com