with语句不推荐使用,现代javascript中应避免;它通过临时改变标识符解析规则将对象属性作为局部变量访问,但破坏静态可分析性、降低性能、导致语义模糊,且被严格模式禁用。

with 语句不推荐使用,现代 JavaScript 中应避免它。它看似能“临时扩展作用域”,实则会破坏作用域的可预测性,导致代码难以调试、优化和静态分析,已被严格模式("use strict")禁用。
with 是什么?它怎么“扩展”作用域?
with 语句将一个对象作为临时作用域前置,使该对象的属性在语句块内可被直接访问,无需写对象名前缀:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const obj = { x: 10, y: 20 };
with (obj) {
console.log(x + y); // 30 —— x 和 y 被当作局部变量查找
z = 5; // 在全局作用域创建 z(非 obj 上!行为模糊)
}
这并非真正“扩展”了词法作用域,而是改变了标识符解析规则:引擎先在 obj 上找属性,找不到再沿作用域链向上找(通常是全局)。这种动态查找让变量来源不明确。
为什么 with 有严重问题?
- 破坏静态可分析性:工具(如 ESLint、打包器、IDE)无法在编译时确定变量归属,影响压缩、重构和类型推断
- 性能差:每次访问变量都要动态检查对象属性,无法做 JIT 优化
- 语义诡异:赋值行为依赖属性是否存在——
x = 1可能修改obj.x,也可能创建全局变量(若obj无x且非严格模式) - 严格模式下直接报错:
Uncaught SyntaxError: Strict mode code may not include a with statement
替代方案:清晰、安全、现代
-
显式解构:适用于已知属性名
const { x, y } = obj;→ 后续直接用x、y -
短变量名绑定:提升可读性又不牺牲明确性
const { width: w, height: h } = canvas;→ 用w、h简洁表达 -
立即执行函数 + 参数传入:模拟作用域隔离(极少需用)
(function({x, y}) { console.log(x + y); })(obj); -
保持点号访问:多数场景下最直白可靠
console.log(obj.x + obj.y);—— 意图清晰,无歧义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










