2015-11-19 30 views
0

我有以下代碼:使用Javascript - return語句誤解

function a(){ 
    b(); 
    return undefined; 
} 

function b(){ 
    c = function(){ }; 
    return c; 
} 
a(); 
console.log(c); //Why can we see it? 

我會告訴你我是怎麼看這或多或少,並請糾正我在哪裏我錯了:

第一個被執行,並創建一個新的執行上下文。當a的執行正在處理時,它也執行b函數,所以有 一個新的執行上下文被創建。

b的執行上下文返回c,這是一個函數,返回到執行上下文。 現在b的執行上下文結束,執行堆棧返回a, ,它看到:「return undefined」。

那麼,現在a的執行上下文正在返回undefined返回給調用者。現在我不明白,c函數是如何存在的(你可以通過console.log(c);)來看到它,以及更多,爲什麼它附加到窗口對象? 爲了我的理解(我知道這是錯誤的),一旦執行上下文結束,它應該被垃圾收集 ,因爲它保存了c的函數引用。

return語句似乎有不可思議的規則,我想澄清一下。感謝您的時間。

+2

您已聲明'c'在全局範圍內。它不受'b()'限制 –

回答

3

這是因爲您使c成爲全局變量(並且所有全局變量都存在於瀏覽器上下文中的窗口對象上)。如果你正確初始化它,你不會看到它在控制檯:

function a(){ 
    b(); 
    return undefined; 
} 

function b(){ 
    var c = function(){ }; // var = local scope only 
    return c; 
} 
a(); 
console.log(c); // No longer can see it, undefined error as expected 

UPDATE /進一步解釋

因爲你的標題提到了return語句,我只是想補充說明這與無關,函數返回,但僅限於變量聲明。您的代碼在沒有任何返回語句的情況下表現相同,因爲您沒有使用函數返回值,例如:

console.log(b()); // will output the value of c, 
        // which is what function b returns 
        // and it doesn't matter if c is global or local 
        // (but try always to use local)