JavaScript中函数调用时绑定的创建顺序及参数解析问题
函数调用时作用域绑定的创建顺序与arguments解析过程
一、作用域绑定的创建顺序
当调用函数并构建其执行上下文的作用域时,绑定的创建顺序确实是:
- 首先创建
arguments绑定,将所有实参以类数组对象的形式存入其中 - 接着按形参定义的顺序,依次为每个形参创建绑定,并将
arguments中对应位置的实参值赋值给形参
需要注意几个细节:
- 如果实参数量少于形参,未匹配到实参的形参会被赋值为
undefined - 若函数定义了剩余参数(如
...rest),剩余参数的绑定会在所有普通形参绑定完成后创建,用于收集所有未被普通形参匹配的实参 - 非严格模式下,具名形参和
arguments对应位置的值是双向绑定的——修改形参会同步修改arguments里的值,反之亦然;严格模式下这种联动关系会被取消,两者各自独立
你给出的示例完全符合这个逻辑:
const fnObj = { formalParams: ["name", "age", "occupation"] }; const fnScope = { arguments: ["alice", 20, "student"], name: "alice", age: 20, occupation: "student" };
二、arguments解析为绑定的过程及代码验证
你写的processArguments函数是一个基础场景的简化实现,能覆盖实参数量与形参数量一致的普通情况,但没有处理所有JavaScript函数参数的复杂场景,具体局限性如下:
- 未处理剩余参数:如果函数包含剩余参数,需要收集未被前面形参匹配的所有实参,你的代码没有这部分逻辑
- 未体现非严格模式的双向绑定:非严格模式下,形参和
arguments的对应值是联动的,你的代码只是做了一次性赋值,无法实现修改形参同步更新arguments的效果 - 未处理重复形参(非严格模式):非严格模式允许重复形参(如
function fn(a, a) {}),此时后面的形参会覆盖前面的,但arguments中对应位置仍保留第一个实参的值,你的代码无法处理这种情况 - 未区分严格模式:严格模式下
arguments与形参完全独立,你的代码没有体现这种差异
如果只是针对实参数量与形参数量一致的普通非严格/严格模式场景,你的代码可以实现基础的绑定赋值,但在复杂场景下并不完整。
你的代码示例:
function processArguments(fnObj, fnScope) { fnObj.formalParameters.forEach((param, i) => { fnScope[param] = fnScope.arguments[i]; }); return fnScope; } //is it a right guess?
内容的提问来源于stack exchange,提问作者Slev7n
相关产品推荐
相关产品推荐

