javascript中with关键字的用法

with关键字可以将一个没有或者有多个属性的对象处理为一个完全隔离的词法作用域,对象的属性也会被处理为定义在这个词法作用域中的词法标识符。
with的典型用法如下:

var obj = {a:1};
console.log(obj.a);//1
with(obj){
    a=123;
}
console.log(obj.a);//123

但是,当obj对象中没有属性a时,结果会怎么样呢?

var obj = {b:2};
with(obj){
    a = 1;
}
console.log(obj.a);//undefined

可见,当对象中没有的属性在with创建的作用域中被赋值时,并不会给对象添加属性。但是,被赋值的标识符会泄漏到全局作用域中。

var obj = {b:2};
with(obj){
    a = 1;
}
console.log(obj.a);//undefined
console.log(a);//1

如果我们在with中使用var关键字,会产生什么效果呢?

var obj = {a:1};
console.log(obj.a);//1
with(obj){
    var a=123;
    var b=4321;
}
console.log(obj.a);//123
console.log(obj.b);//undefined
console.log(b);//4321
function foo(obj){
    with(obj){
        var b=4321;
    }
    console.log(b);//4321
}
obj = {};
foo(obj);
console.log(b);//会报错 ReferenceError: b is not defined

上面两段代码说明,在with作用域中使用var关键字时,如果标识符是对象的属性,则和不使用var关键字的效果一样,如果不是,那么标识符会泄漏到上一级作用域

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

推荐阅读更多精彩内容