JavaScript with语句

1,103 阅读1分钟
不建议使用with语句,因为它可能是混淆错误和兼容性问题的根源。在 ECMAScript 5 严格模式中该标签已被禁止。推荐的替代方案是声明一个临时变量来承载你所需要的属性。

with语句 扩展一个语句的作用域链。

语法

with (expression) {
    statement
}
expression
将给定的表达式添加到在评估语句时使用的作用域链上。表达式周围的括号是必需的。
statement
任何语句。要执行多个语句,请使用一个语句 ({ ... })对这些语句进行分组。

描述

JavaScript查找某个未使用命名空间的变量时,会通过作用域链来查找,作用域链是跟执行代码的context或者包含这个变量的函数有关。with语句將某个对象添加到作用域链的顶部,如果在statement中有某个未使用命名空间的变量,跟作用域链中的某个属性同名,则这个变量将指向这个属性值。如果沒有同名的属性,则将拋出ReferenceError异常。

Example:

下面的with语句指定Math对象作为默认对象。with语句里面的变量,分別指向Math对象的PIcossin函数,不用在前面添加命名空间。

let a, x, y
let r = 10
with (Math) {
  a = PI * r * r  
  x = r * cos(PI)
  y = r * sin(PI / 2)
}在

模块作用域中的with:

文件 a.js

module.exports = {
  x: 1
}

文件 b.js 

const obj = require('./a')
with (obj) {
  console.log(x)
  console.log(y)
}
// 1
// ReferenceError: y is not defined