不建议使用with语句,因为它可能是混淆错误和兼容性问题的根源。在 ECMAScript 5 严格模式中该标签已被禁止。推荐的替代方案是声明一个临时变量来承载你所需要的属性。
with
扩展一个语句的作用域链。
语法
with (expression) {
statement
}
expression
将给定的表达式添加到在评估语句时使用的作用域链上。表达式周围的括号是必需的。
statement
任何语句。要执行多个语句,请使用一个块语句 ({ … })对这些语句进行分组。
描述
JavaScript查找某个未使用命名空间的变量时,会通过作用域链来查找,作用域链是跟执行代码的context或者包含这个变量的函数有关。with语句將某个对象添加到作用域链的顶部,如果在statement中有某个未使用命名空间的变量,跟作用域链中的某个属性同名,则这个变量将指向这个属性值。如果沒有同名的属性,则将拋出ReferenceError异常。
Example:
下面的with语句指定Math对象作为默认对象。with语句里面的变量,分別指向Math对象的PI 、cos和sin函数,不用在前面添加命名空间。
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
参考链接:
MDN JavaScript with