with通常被當做重複引用同一對象中的多個屬性的快捷方式。可以不需要重複引用對象本身。
一個例子引發的思考:
function foo(obj){
with(obj){
a=2;
}
}
var o1=
{a:2}
var o2={b:3}
foo(o1);
console.log(o1.a)//2
foo(02);
console.log(o2.a)//undefined
console.log(a)//2
我們可以注意到一個奇怪的副作用,a=2賦值操作實際上創建了一個全局變量a,
with可以將一個沒有或有多個屬性的對象處理爲一個完全隔離的詞法作用域,因此這個對象的屬性也會被處理爲定義在這個作用域中的標識符。
儘管with塊可以將一個對象處理爲詞法作用域,但是這個塊內部正常的var聲明並不會被限制在這個塊的作用域當中,而是被添加到with所處的函數作用域。