参数重新定义¶
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;
}