arguments与形参的动态绑定指非严格模式下二者值双向同步:修改a会改变arguments[0],反之亦然;严格模式下该绑定被解除,二者仅初始化时拷贝,后续完全独立。

在严格模式下,JavaScript 会断开 arguments 对象与函数形参之间的动态绑定关系,这是为了提升代码可预测性、避免隐式行为,并为引擎优化(如内联缓存、JIT 编译)提供基础。
什么是 arguments 与形参的动态绑定?
在非严格模式下,arguments 是一个类数组对象,其索引属性(如 arguments[0])与对应位置的形参变量是双向同步的:修改形参值会反映在 arguments[i] 上,反之亦然。
例如:
function foo(a) {
console.log(a); // 1
console.log(arguments[0]); // 1
a = 2;
console.log(a); // 2
console.log(arguments[0]); // 2 ← 动态绑定生效
}
foo(1);
严格模式如何禁止这种绑定?
在严格模式下,arguments 对象仍存在,但其元素与形参变量完全独立:它们只是初始化时拷贝了传入值,后续互不干扰。
立即学习“Java免费学习笔记(深入)”;
实现方式包括:
- 函数进入时,引擎为
arguments创建一个只读或静态快照(不追踪形参变化) - 形参被当作普通局部变量处理,不再与
arguments建立隐藏引用 - 禁止使用
arguments.callee和arguments.caller(进一步切断运行时耦合)
如何启用并验证该行为?
在函数体顶部添加 "use strict"; 即可启用严格模式:
function bar(a) {
"use strict";
console.log(a); // 1
console.log(arguments[0]); // 1
a = 2;
console.log(a); // 2
console.log(arguments[0]); // 1 ← 不再同步!
}
bar(1);
注意:arguments 本身仍是可读的,但修改它不会影响形参,修改形参也不会更新 arguments。
实际开发中的建议
- 始终使用严格模式(现代项目默认开启,如 ES6 模块、class、箭头函数均自动严格)
- 避免依赖
arguments的动态行为,改用剩余参数...args(更清晰、无绑定问题) - 若需兼容旧写法,可通过
Array.from(arguments)或[...arguments]转为真实数组再操作


















