2016-09-29 40 views
0

當我執行下面的JavaScript時,我期待b()的控制檯日誌打印undefined。 (因爲我沒有聲明姓名)。Javascript調用堆棧/執行上下文參考

function b(){ 
    console.log(name); 
} 

function a(){ 
    var name = "rupesh"; 
    b(); 
} 

var name = "Demo"; 
a(); 

預期輸出:未定義

實際輸出:演示

我一直在閱讀上的全球執行上下文,使用Javascript的執行上下文。有人提到,執行上下文將查找全局執行上下文。

但是,如果我理解正確,函數a()和函數b()在堆棧中執行。它如何返回到執行上下文(在數據結構方面,這不會發生)。

有點困惑。請解釋這是如何工作的!

+1

吊裝。 http://www.adequatelygood.com/JavaScript-Scoping-and-Histing.html – Will

回答

1

當我執行下面的JavaScript,我期待b()的控制檯日誌打印undefined。 (因爲我沒有聲明姓名)。

技術上name聲明。這就是所謂的提升。所以,runtimer「捕捉」所有的聲明並將它們放在函數的頂部(在你的情況下,因爲它不在函數內部,它們被附加到全局名稱空間)。因此,這將會是這樣的:

var name; 
function b(){ 
    console.log(name); 
} 
... 

現在,當a()被稱爲name變量值分配,在這種情況下"Demo"

裏面function a() {...}您分配一個又打電話name變量,但因爲這有var之前,即name不會改變全球name(我想你已經想通了這一點,因爲你預期nameundefined )。

最後,當在a()內部調用b()時,它看起來是全局的name變量,該變量分配了"Demo"值。

只是爲了展示全貌,這就是運行時如何「看到」您的代碼:

var name; 

function b(){ 
    console.log(name); 
} 

function a(){ 
    var name = "rupesh"; 
    b(); 
} 

name = "Demo"; 
a(); 
+0

驚人的解釋不了更好 – TechnoCorner

+0

很高興幫助! :) –