2015-07-12 70 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次“飞” –