2015-05-06 62 views
2

有人可以向我解釋下面三個例子中發生了什麼? 我的想法是第一個例子,bar沒有執行(這只是一個函數聲明),所以當foo執行時,輸出是undefined?對於第二個示例,執行bar,以便返回值3。對於第三個例子,我不知道它爲什麼產生8.有人可以解釋這些函數的定義和提升?

// 1) 
function foo() { 
    function bar() { 
     return 3; 
    } 
} 
foo(); // undefined 

// 2) 
function foo() { 
    function bar() { 
     return 3; 
    } 
    return bar(); 
} 
foo(); // 3 

// 3) 
function foo(){ 
    function bar(){ 
     return 3; 
    } 
    return bar(); 
    function bar() { 
     return 8; 
    } 
} 
foo(); // 8 
+0

'bar()'在第三個示例中聲明瞭兩次。由於第二個聲明是最後一個,所以返回8. – ElGavilan

+0

1)在第一種情況下,如果調用foo(),則會執行foo(),並且bar()現在可用。但爲了執行欄,你需要明確地調用它。 2)在第二種情況下,您正在調用foo(),並且在foo()欄中可用,並且您正在通過編寫return bar()來調用bar()。 3)第三種情況見第二種情況的解釋。欲瞭解更多信息,請參閱:http://stackoverflow.com/questions/7295634/javascript-nested-function –

+0

如何明確調用bar? – DaeYoung

回答

3

您即將例1和2是正確的,所以我就解決例如3

雖然它看起來像你打電話bar()重新定義之前,function聲明被特殊處理。這些函數都是在第一次輸入包含範圍時定義的,它們不是按順序執行的。如果你對同一個函數有多個聲明,最後一個是有效的聲明。因此,有沒有什麼區別:

function bar() { 
    // version 1 
} 
return bar(); 
function bar() { 
    // version 2 
} 

和:

function bar() { 
    // version 2 
} 
return bar(); 

這是一個函數聲明從分配函數表達式的變量不同的方式。如果你寫:

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

那麼它會返回3

+0

這是IMO最好的答案,因爲它提到了var x =函數語法以及執行函數聲明的時間。 –

0

你對前兩個例子的假設是正確的。

最後一個示例返回8,因爲在調用foo之前正在重新定義bar。這裏是事件的一個基本的時間表:

  1. foo定義

    • bar定義爲返回3
    • bar被重新定義爲返回8
  2. 功能的功能foo被調用
    • return語句被擊中並執行重新定義bar函數,返回8
0

在你的第三個例子,bar()聲明兩次。返回8的聲明是最後聲明的,因此它重新定義bar()並且是執行的聲明。

function foo(){ 
    function bar(){ // first declaration of bar() 
     return 3; 
    } 

    return bar(); // this executes the code in bar() as it was most recently redefined 

    function bar() { // second and last declaration of bar(); this redefines the 
        // first declaration 
     return 8; 
    } 
} 
foo(); // 8 
0

如果使用相同的名稱和範圍函數聲明兩次,所以會忽略第一個和執行第二功能。這就是#3發生的事情。

+0

所以返回bar()函數bar(){return 8; } 宣言? – DaeYoung

+0

@DaeYoung Youe'return bar()'語句是聲明爲function bar(){return 8; }' – ElGavilan

+0

當JavaScript執行時,'var bar = function()'會出現提升。這意味着它將被帶到範圍的頂部,因爲它是一個變量聲明,然後運行使用/操作該數據的函數(在本例中爲'return'語句)。關於該主題的Google javascript提醒 –

2

您正在尋找的真實答案是吊裝

在你的第三個例子,什麼是真正的JavaScript解釋執行的是:

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

foo(); // 8 

function聲明首先處理,從他們被調用的函數的範圍。我強烈建議你找的是在Javascript什麼提升更多的講座,比如,你可以用這個啓動:

http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

+0

現在我清楚地看到發生了什麼。謝謝! – DaeYoung

0

當下面執行函數的聲明被提升到IIFE範圍之巔 - 中第二個聲明覆蓋第一個。

(function IIFE(){ 
    function bar(){ 
     return 3; 
    } 
    return bar(); 
    function bar() { 
     return 8; 
    } 
})() 

(function IIFE(){ 
    function bar(){ 
     return 3; 
    } 
    function bar() { 
     return 8; 
    } 
    return bar(); 
})() 

(function IIFE(){ 
    function bar() { 
     return 8; 
    } 
    return bar(); 
})() 
相關問題