js中的with语句

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):

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。