形参和实参的映射发生在函数调用时执行上下文的创建阶段,按声明顺序绑定实参值或undefined,优先级高于var/function但低于let/const,且为单向值拷贝或引用地址拷贝。

JavaScript 函数执行上下文里,形参和实参的映射发生在函数调用时的编译阶段(Creation Phase),是执行上下文初始化的关键一步,不是运行时动态赋值,也不依赖后续代码执行。
形参在函数执行上下文中如何初始化
当函数被调用,V8 创建该函数的执行上下文后,会立即处理形参:
- 形参被视为函数作用域内的局部变量,被添加到当前执行上下文的变量环境(Variable Environment)中;
- 每个形参按声明顺序绑定一个名称,并赋予初始值:对应位置的实参值(如果提供了),否则为
undefined; - 这个过程发生在任何函数体代码执行之前,属于“预处理”,和
var提升同阶段; - 即使实参是
undefined,它也会被原样赋给形参——这和“未传参”效果一致,但语义不同。
实参个数与形参个数不匹配时的行为
JavaScript 不强制参数个数一致,映射规则明确且可预测:
- 实参少于形参:多余形参直接初始化为
undefined; - 实参多于形参:多余实参被忽略,但可通过
arguments对象或剩余参数...rest访问; - 注意:
arguments是类数组对象,反映的是调用时传入的全部实参,与形参列表无关; - ES6 的默认参数(如
a = 'default')只在形参值为undefined时触发,null或其他假值不会触发。
形参与同名变量/函数声明的冲突
形参的绑定优先级高于 var 和 function 声明,但低于 let/const(因后者在词法环境中,且受 TDZ 约束):
- 函数内用
var b声明变量,若形参也有b,则var b不会覆盖形参,只是重复声明(无报错,但无效); - 函数内用
function b() {}声明,同样会被形参b覆盖(函数提升仍发生,但执行上下文中形参值优先生效); - 但若写
let b = ...或const b = ...,且形参已是b,则直接抛出SyntaxError: Identifier 'b' has already been declared——这是编译期错误,发生在创建阶段。
映射本质是单向绑定,不是引用传递
形参获得的是实参的值拷贝(原始类型)或引用地址拷贝(对象/数组),修改形参本身不会影响外部实参变量:
-
function f(x) { x = 100; }中,外部变量不变; -
function f(obj) { obj.name = 'new'; }中,外部对象属性会被改——因为拷贝的是引用,而非对象副本; - 形参无法反向赋值给调用时的实参变量(JS 没有引用传递或输出参数机制)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











