2015-07-12 47 views
1

我正在通過Head First JavaScript瞭解嵌套函數。以下是我無法理解的代碼。關於Javascript中的嵌套函數

var migrating = true; 
if (migrating) { 
    quack(4); 
    fly(4); 
} 

var fly = function(num) { 
    var sound = "Flying"; 
    for (var i = 0; i < num; i++) { 
     wingFlapper(); 
    } 
    function wingFlapper() { 
     console.log(sound); 
    } 
}; 

function quack(num) { 
    var sound = "Quack"; 
    for (var i = 0; i < num; i++) { 
     quacker(); 
    } 
    var quacker = function() { 
     console.log(sound); 
    }; 
} 

書中說「quacker由函數式 功能嘎嘎定義,所以它的範圍是整個 嘎嘎的功能,但它只是定義了 函數表達式求值之後,直到年底 功能體「。 因此,我在函數評估之前調用函數,所以不應該拋出異常,或者我不理解這個概念?

+0

我在chromes控制檯中得到一個'Uncaught TypeError:quacker不是函數'。看看這個[fiddle](http://jsfiddle.net/34h4e2dd/),當你運行時,控制檯中的任何消息? –

+0

我無法理解它,因爲它縮進嚴重。 http://jsbeautifier.org/ – Bergi

+1

我爲你清理了縮進。使用正確的縮進來指示代碼的結構非常重要。 (@Bergi,看起來像我的編輯與您的評論交叉路徑。) –

回答

-1

沒錯。這應該。如果你嘗試一些瀏覽器控制檯的例子,你會看到類似這樣的東西:

Uncaught TypeError: quacker is not a function 
    at quack (<anonymous>:26:1) 
    at <anonymous>:5:1 
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140) 
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34) 
    at Object.InjectedScript.evaluate (<anonymous>:694:21) 
+0

多數民衆贊成我期待什麼我的瀏覽器(鉻)實際上是不會拋出異常,並運行它就好 –

+0

在我寫了我的答案之前,我已經在Chrome中測試代碼並粘貼錯誤消息。打開新標籤並粘貼完全相同的代碼。它會拋出異常。 ;) – Marii

+0

我已經在safari,firefox和chrome中測試過這段代碼,我也沒有看到異常。 –

0

這應該是錯誤的。 quacker()是一種自上而下的函數表達式。如果您將該函數表達式更改爲函數語句,它應該可以正常工作。我知道這是混淆看看這個

Why can I use a function before it's defined in Javascript?

試試這個。它不應該錯誤,因爲我們正在使用函數語句綁定到上下文(全局在這裏)之前執行其他任何事情。

function qaucker() 
{ 
    console.log(sound); 
}; 
+0

Thanks.I理解JS解釋器如何評估函數聲明和表達式,並且我期待着一個錯誤。所以我唯一擔心的是爲什麼我的瀏覽器在它應該的時候沒有拋出異常。 –

+0

嗯。真奇怪。目前得到的任何輸出,如果沒有錯誤。 –

+0

4次「嘎嘎」和4次「飛」 –