2015-09-09 34 views
1

我是JavaScript新手,我有一個困惑。
正如我們總是在返回語句無法訪問之後教過的那樣。
但在下面的情況下,這是不正確的,我不明白爲什麼它如此。爲什麼在javascript語句返回語句之後的代碼可用

function foo() { 

    //define bar once 
    function bar() { 
     return 3; 
    } 

    //redefine it 
    function bar() { 
     return 8; 
    } 

    //return its invocation 
    return bar(); //8 
} 
alert(foo()); 

http://jsfiddle.net/jainhimanshu/euga4mcy/
輸出爲8,但它應該是3

因此,誰能讓我清醒的概念。

+2

從本質上講,你說:'X = 3'然後'X = 8'。那麼爲什麼你期待'x == 3'? – Johan

+0

@Johan對不起,但沒有。它永遠不會說'x = 3'。第一個函數從未被調用,因爲它被第二個函數覆蓋。 – Archer

+0

@Archer很好,'bar = 3'然後'bar = 8'然後'return bar' ...正是我所說的和上面寫的。 – Johan

回答

4

這是因爲您必須調用該函數才能從中獲取return值。

功能bar不被調用,它只被定義。

所以,當函數foo()被稱爲

return bar(); 

foo執行並返回8

編譯器看到foo如下(重寫bar後):

function foo() { 
    function bar() { 
     return 8; 
    } 

    return bar(); 
} 
alert(foo()); 

當達到return bar(),功能bar被調用,它的返回值。

後的bar

function foo() { 
    return 8; 
} 
alert(foo()); 
+0

嗨@Tushar,我瞭解提升,但不能夠有一件事情,即一個函數如何重寫另一個函數定義的定義,並假設如果兩個函數的定義不同但名稱相同,那麼結果如何。請探索 –

+0

@HimanshuJain先前定義的函數被後來覆蓋,這就是發生在你的情況 – Tushar

+0

是@Tushar,我明白但是如果函數定義完全不同但是函數名稱相同他們早些時候被後來的功能覆蓋了 –

0
function foo(){ 
    // .... 
} 

調用創建新Function object,並且受讓人命名foo它。它仍然沒有被調用,只是被創建,所以任何return語句都不會被觸發。

當這個函數內部創建新Functions,像

function foo(){ 
    function bar() { 
    return 3; 
    } 
    return 4; 
} 
// after you execute foo 
console.log(foo()); // will log 4 

但非常重要的是,這個詞彙域內,功能bar被創建,但沒有在那裏執行。又見Lexical scope

但是,當你有一個名爲bar這個

function foo(){ 
    function bar(){ 
    return 3; 
    } 
    function bar() { 
    return 8; 
    } 
    return bar(); 
} 
// after you execute foo 
console.log(foo()); // will log 8 

當你執行功能fooglobal範圍,它創建函數對象,那麼它創建了一個名爲bar新的函數對象,舊的被重新定義,與爲variable分配新值相同,值更改,但在此上下文中,分配給函數名稱的函數體發生了更改。

因爲您的功能fooreturn關鍵字,它會返回該值。它返回的值是返回函數bar的值,因爲return bar();將執行函數bar並返回從函數bar收到的值,例如它的值爲8。

比較變量的重新定義與功能的重新定義

var a; 
a = "some string"; 
a = 5; // a has value 5, no mater older values 
// same goes for functions 
function bar(){ .... } 
function bar(){ .... } 
function bar(){ .... } 
// invoke bar 
bar(); // last function bar will be executed, no mater other function's bar definitions 
+0

嗨@Nermin,我理解你的觀點,但是如果在函數foo中定義的兩個函數bar的定義完全不同,那麼會發生什麼情況呢?將如何重新定義它們以及輸出是什麼。 –

相關問題