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 年。