with语句的用途是将代码作用域设置为特定的对象
假设有一个对象,要获取某个对象内属性对应的值可以如下方式获取,若对象的属性值较多,就不方便了。
let obj = {
a = 1;
b = 2;
}
let A = obj.a,B = obj.b;
console.log(A,B)//1,2
使用with,可以快速获取对象属性的值
let obj = {
a = 1;
b = 2;
}
with(obj){
console.log(a,b)//1,2
}
但是当获取的变量在对象中不存在会报错
let obj = {
a = 1;
b = 2;
}
with(obj){
console.log(c)//c is not defined
}
修改对象的某个属性的值,也可以使用with
varobj={
a:1,b:2,c:3
};
//单调乏味的重复"obj"
obj.a=2;
obj.b=3;
obj.c=4;
//简单的快捷方式
with(obj){
a=3;b=4;c=5;
}
function foo(obj) {
with (obj) {
a = 2;
}
console.log(a)//2
}
foo({})
console.log(a)//2
发现a泄漏到全局了
function foo(obj) {
with (obj) {
var a = 2;
}
console.log(a)//2
}
foo({})
console.log(a)//a is not defined
with 块可以将一个对象处理为词法作用域,但是这个块内部正常的 var 声明并不会被限制在这个块的作用域中,而是被添加到 with 所处的函数作用域中。
注意:严格模式下不允许使用with,会抛出异常。
with现不推荐使用,会影响性能。
在with中,只能使用和更改对象的已有属性,不能为对象添加新属性;在with中添加的属性或方法会作为全局对象的属性和方法。with在闭包中执行,会放弃变量的回收,造成GC(垃圾回收GC):