2015-05-06 27 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(); 
})() 
相关问题