JavaScript函数参数是否被提升?执行上下文变量环境结构疑问
嘿,这两个问题问到点子上了,都是理解JS执行上下文的核心点,咱们一步步说清楚。
一、JavaScript中的函数参数是否会被提升?
答案是会的,而且函数参数的提升优先级比普通变量声明更高。
在函数执行上下文的创建阶段,JS引擎会先处理函数的形参:
- 为每个形参创建一个变量绑定,并初始化为
undefined - 如果函数调用时有传入对应参数,就把这个绑定的值更新为传入的参数值
举个直观的例子,哪怕你在函数内部声明了和形参同名的变量,参数的提升也会覆盖变量声明的提升效果(注意是声明,不是赋值):
function foo(a) { var a = 3; console.log(a); // 输出3,这里是赋值覆盖了参数的初始值,而非变量声明覆盖参数 } foo(1);
回到你给出的代码:
function foo(a,b){ return a + b; } foo(1,2);
在foo的执行上下文创建阶段,a和b已经被提升并初始化为undefined,等到执行阶段,才会把传入的1和2分别赋值给a和b,最终返回3。
二、函数执行上下文创建阶段的VariableEnvironment结构是否正确?
你的思路方向是对的,但结构描述有点不准确,咱们来修正一下:
首先,函数执行上下文的VariableEnvironment(VE)是一个函数环境记录(Function Environment Record),它的结构并不是把Arguments对象和形参绑定分成两个独立对象,而是包含以下核心部分:
[[Arguments]]: 指向一个Arguments对象,在创建阶段(还没执行函数体、未传入参数时),这个对象的结构是{0: undefined, 1: undefined, length: 2}- 形参绑定:
a和b作为绑定存在于环境记录中,初始值都是undefined(非严格模式下,这些形参和Arguments对象的对应索引是联动的,比如给a赋值会同步更新arguments[0]) outer: 指向全局环境的LexicalEnvironment(也就是你说的refToGlobalLE)
所以正确的VE结构应该更像这样(简化描述):
VE = { [[EnvironmentRecord]]: { [[Arguments]]: {0: undefined, 1: undefined, length: 2}, a: undefined, b: undefined }, outer: refToGlobalLE }
等到函数执行阶段,传入的参数1和2会被赋值给a和b,同时Arguments对象的0和1也会同步变成1和2。
内容的提问来源于stack exchange,提问作者Abdou Bestmood
相关产品推荐
相关产品推荐

