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
with 语句在访问同一对象的多个属性时提供了一种简写方式。如果在该对象上找不到属性,则会搜索封闭作用域以查找同名变量。这令人困惑,并且使代码变得脆弱且难以阅读。因此,最好避免使用 with。
建议¶
通过引入显式属性访问来消除 with 语句。
示例¶
以下代码片段通过 with 语句从存储在 record 中的对象读取属性 firstName、lastName 和 email。它还调用了 addRecord 函数,该函数推测在封闭作用域中定义。
function process(record) {
with (record) {
addRecord(firstName + " " + lastName, email);
}
}
请注意,如果 record 不具有任何属性 firstName、lastName 或 email,则将在封闭作用域中将它们查找为变量。相反,如果它恰好具有属性 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 年。