JavaScript关键字`with`是否确实已被废弃?
关于JavaScript
with 语句的现状答疑 咱们先把这事儿说透——with语句绝对是JavaScript圈子里被黑了几十年的“不良编码典范”,完全不推荐使用。
为啥大家都讨厌它?
- 变量查找太混乱:
with会改变作用域链的优先级,你写的变量到底是来自with包裹的对象,还是全局变量,有时候连写代码的人自己都懵,后续维护代码的人更是要骂娘。 - 性能拉胯:JS引擎对
with块里的代码根本做不了优化,因为变量的指向是动态的,编译阶段没法确定,执行速度直接打折扣。
严格模式下的实锤
你观察到的情况完全正确:
- 只要开启了严格模式(在代码顶部加
'use strict';),用with直接就抛语法错误,比如Chrome会提示Uncaught SyntaxError: Strict mode code may not include a with statement。 - 像Google Closure Compiler这类代码检查工具,也会直接亮红警告,明确说严格模式不允许用
with——相当于从开发环节就把这条路堵死了。
关于“废弃”的争议点
你提到的MDN说法是对的:截至目前,with并没有被ECMAScript标准正式标记为“废弃”(也就是没从标准里移除),但标准文档里明明白白写着强烈建议避免使用,而且各大浏览器厂商也都站在“抵制with”的阵营里。
为啥会有“已废弃”的传言?大概率是因为它被严格模式彻底封杀,加上社区、工具的全面排斥,给人一种“已经被废掉”的错觉,但从标准层面来说,它还没被打上deprecated的标签。
最后给个准信
别纠结它是不是“正式废弃”了——不管标准怎么定义,现在前端圈的共识就是:绝对不要在生产代码里用with。哪怕你能绕开严格模式,它带来的维护成本和性能问题,都远远抵不上那点“少写几个对象前缀”的便利。
内容的提问来源于stack exchange,提问作者Tomas Langkaas
相关产品推荐
相关产品推荐

