知识卡片
with破坏可读性
内容
with (obj) { a=b; } 实际可能等价于 a=b、a=obj.b、obj.a=b、obj.a=obj.b 中任意一种,取决于 obj 是否恰好拥有 a/b 属性,且这归属关系可能随运行变化——仅读代码无法确定真实目标。with 还阻断变量名的词法作用域绑定,拖慢执行速度。发散:让名字解析变模糊的特性,会同时伤害可读性、调试和优化,这正是 with 可以完全避免的原因。
参考来源
- 位置:《JavaScript语言精粹(修订版)》附录B《糟粕 Bad Parts》"with语句"一节
- 结论依据:原文展示 `with (obj) { a = b; }` 等价于四种不同语句中的某一条,并说明"通过阅读程序代码,你不可能辨别出你会得到的是这些语句中的哪一条……它甚至可能在程序运行过程中就发生了变化",同时指出 with 阻断词法作用域绑定、拖慢执行速度,据此推出 with 应被避免使用的结论。
- 原始内容:通过阅读程序代码,你不可能辨别出你会得到的是这些语句中的哪一条。它可能随着程序运行到下一步时发生变化……with语句在这门语言里存在,本身就严重影响了JavaScript处理器的速度,因为它阻断了变量名的词法作用域绑定。