参数重新定义¶
ID: js/arguments-redefinition
Kind: problem
Security severity:
Severity: recommendation
Precision: very-high
Tags:
- efficiency
- maintainability
Query suites:
- javascript-security-and-quality.qls
JavaScript 函数可以通过特殊的 arguments 对象按位置(而不是按参数名称)访问其参数。但是,如果函数声明了一个名为 arguments 的参数或局部变量,或者为 arguments 赋值,那么 arguments 对象将不再可用。这会让人困惑,并使代码难以理解,因此应该避免这种情况。
还要注意,许多流行的 JavaScript 引擎(例如 Google Chrome 和 Node.js 使用的 V8)不支持对分配给 arguments 的函数进行优化,因此此类函数运行速度会更慢。
建议¶
将变量重命名为其他名称。
示例¶
在以下示例中,函数 f 的 arguments 参数会遮蔽特殊的 arguments 变量。因此,arguments 对象无法在 f 内部访问。对于不经意的读者来说,测试 x === arguments[0] 看起来可能是多余的,因为通常 arguments[0] 指的是第一个参数(在本例中为 x),这将使测试变得微不足道地成立。但是,这里情况并非如此,因为 arguments[0] 指的是作为第二个参数传入的数组的第一个元素。
function f(x, arguments) {
if (x === arguments[0])
return 23;
return 42;
}