2017-04-17 90 views
0

我的前言說我知道使用with是非常不鼓勵,我也不打算使用它。我只是想知道它是如何工作的(我試圖找出javascript中的範圍)。變量聲明在一個With塊

如果我有一些像這樣的代碼:

function foo(obj) { 
    with (obj) { 
     b = 2; 
    } 
} 

var o1 = { 
    a: "something" 
}; 

foo(o1); 
console.log(o1.b) // This outputs undefined (makes sense) 
console.log(b) // This outputs 2 (makes sense) 

但是,如果我改變富來是這樣的:

function foo(obj) { 
    with (obj) { 
     var b = 2; // I use var b instead of b 
    } 
} 

當我通過O1爲foo,再次,O1沒有屬性b。爲什麼是這樣?我認爲使用var會在obj的範圍內聲明b,所以該屬性將在o1中而不是在全局範圍內創建。

回答

2

var聲明被吊銷。所以,你正在執行的是相當於

function foo(obj) { 
    var b; 
    with (obj) { 
     b = 2; 
    } 
} 

不要緊,該聲明是with塊內。 §9.2.12描述了評估函數體時會發生什麼。在步驟11/12中,收集所有變量聲明。一個with聲明只是「轉發」其中的所有聲明(see spec)。

1

變量聲明(使用var)不尊重塊範圍,而是將hoisted置於範圍的頂部。就編譯器/解釋器而言,您的代碼實際上是:

function foo(obj) { 
    var b = undefined; 
    with (obj) { 
     b = 2; 
    } 
}