严格模式下arguments不可重新赋值且属性修改静默失效,应使用Array.from(arguments)或剩余参数(...args)替代;arguments.callee/caller访问会抛TypeError。

严格模式下,arguments 本身不能被“重新赋值”——它不是变量,而是一个只读的类数组对象。你无法执行 arguments = [] 或 arguments = new Array() 这类操作,否则会直接抛出 SyntaxError(因为 arguments 是严格模式下的保留字,禁止用作标识符)。
arguments 在严格模式下不可被声明或赋值
以下写法在严格模式中全部非法,会报语法错误:
var arguments = [];-
function foo(arguments) { }(形参名不能叫arguments) const arguments = {};-
arguments = "hello";(运行时虽不总报错,但属无效操作,且现代引擎通常拒绝解析)
真正需要防范的是对 arguments 的属性修改
虽然不能重赋整个 arguments,但有人会尝试改它的元素,比如 arguments[0] = 5。在严格模式下,这种赋值静默失败(不报错,但不生效),参数值保持原样:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
'use strict';
function fn(a) {
arguments[0] = 99;
console.log(a); // 仍输出原始传入值,如调用 fn(1) → 输出 1
}
如何确保完全隔离 arguments 的影响
如果业务逻辑需要操作实参副本,应主动创建独立数组,避免依赖 arguments 的任何可变行为:
立即学习“Java免费学习笔记(深入)”;
- 用
[].slice.call(arguments)或更现代的Array.from(arguments) - 推荐使用剩余参数替代:
function fn(...args) { /* args 是真数组,完全可控 */ } - 剩余参数是 ES6 标准方案,在严格/非严格模式下行为一致,无绑定、无只读限制
arguments.callee 和 caller 已被彻底禁用
严格模式下,访问 arguments.callee 或 arguments.caller 会触发 TypeError,不是静默失败。这是明确的运行时禁止,无需额外“禁止”,只要启用严格模式即自动生效。

















