CodeQL 文档

With 语句

ID: js/with-statement
Kind: problem
Security severity: 
Severity: warning
Precision: very-high
Tags:
   - maintainability
   - language-features
Query suites:
   - javascript-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

with 语句在访问同一对象的多个属性时提供了一种简写方式。如果在该对象上找不到属性,则会搜索封闭作用域以查找同名变量。这令人困惑,并且使代码变得脆弱且难以阅读。因此,最好避免使用 with

建议

通过引入显式属性访问来消除 with 语句。

示例

以下代码片段通过 with 语句从存储在 record 中的对象读取属性 firstNamelastNameemail。它还调用了 addRecord 函数,该函数推测在封闭作用域中定义。

function process(record) {
	with (record) {
		addRecord(firstName + " " + lastName, email);
	}
}

请注意,如果 record 不具有任何属性 firstNamelastNameemail,则将在封闭作用域中将它们查找为变量。相反,如果它恰好具有属性 addRecord,则函数调用将尝试将此属性的值作为方法调用。

为了阐明代码的预期含义,应删除 with 语句,并引入属性访问以明确哪些名称意在从 record 读取,以及哪些名称意在从封闭作用域中查找。

function process(record) {
	addRecord(record.firstName + " " + record.lastName, record.email);
}

请注意,在严格模式代码中不允许使用 with 语句。

参考文献

  • D. Crockford,JavaScript: The Good Parts,附录 B.2。O’Reilly,2008 年。

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