2014-10-27 26 views
2

我在互聯網瀏覽並在此JavaScript函數如何理解我的函數的輸出在JavaScript

function foo(){ 
     function bar() { 
      return 3; 
     } 
     return bar(); 
     function bar() { 
      return 8; 
     } 
    } 
    console.log(foo()); 
    =>8 

這真是混亂爲什麼這個函數返回時,8它叫出來。我會假設這段代碼會運行該函數的內容,並停止在return bar();並返回3.我在這裏錯過了什麼?

+2

這是因爲函數聲明被懸掛在塊的頂部。 – zakangelle 2014-10-27 20:52:45

+1

函數被吊起來 - 如果它在聲明後被聲明並不重要,它仍然可以運行。最後一個'bar()'覆蓋第一個。 – tymeJV 2014-10-27 20:52:48

+0

只是好奇,這是純粹的學術價值問題嗎?爲什麼有人會這樣寫代碼?真的,有一個很好的理由嗎? – 2014-10-27 20:55:54

回答

3

這是變量提升的結果。 function的定義比其他任何東西都要先。這真的是這樣

function foo(){ 
    var bar; 
    bar = function() { 
     return 3; 
    } 
    bar = function() { 
     return 8; 
    } 
    return bar(); 
} 

「因爲變量聲明(和一般的聲明)進行處理在執行任何代碼之前,在代碼的任何地方聲明一個變量就相當於在頂部宣佈吧。」 varMDN

+0

可能值得一提的是,在原始代碼中使用'var bar = function(){...}'實際上會在這裏產生影響。 – 2014-10-27 21:06:05