CodeQL 文档

参数重新定义

ID: js/arguments-redefinition
Kind: problem
Security severity: 
Severity: recommendation
Precision: very-high
Tags:
   - efficiency
   - maintainability
Query suites:
   - javascript-security-and-quality.qls

单击以查看 CodeQL 仓库中的查询

JavaScript 函数可以通过特殊的 arguments 对象按位置(而不是按参数名称)访问其参数。但是,如果函数声明了一个名为 arguments 的参数或局部变量,或者为 arguments 赋值,那么 arguments 对象将不再可用。这会让人困惑,并使代码难以理解,因此应该避免这种情况。

还要注意,许多流行的 JavaScript 引擎(例如 Google Chrome 和 Node.js 使用的 V8)不支持对分配给 arguments 的函数进行优化,因此此类函数运行速度会更慢。

建议

将变量重命名为其他名称。

示例

在以下示例中,函数 farguments 参数会遮蔽特殊的 arguments 变量。因此,arguments 对象无法在 f 内部访问。对于不经意的读者来说,测试 x === arguments[0] 看起来可能是多余的,因为通常 arguments[0] 指的是第一个参数(在本例中为 x),这将使测试变得微不足道地成立。但是,这里情况并非如此,因为 arguments[0] 指的是作为第二个参数传入的数组的第一个元素。

function f(x, arguments) {
	if (x === arguments[0])
		return 23;
	return 42;
}

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私