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关键字的效果一样,如果不是,那么标识符会泄漏到上一级作用域