2015-09-09 35 views
1

我是JavaScript新手,我有一个困惑。
正如我们总是在返回语句无法访问之后教过的那样。
但在下面的情况下,这是不正确的,我不明白为什么它如此。为什么在javascript语句返回语句之后的代码可用

function foo() { 

    //define bar once 
    function bar() { 
     return 3; 
    } 

    //redefine it 
    function bar() { 
     return 8; 
    } 

    //return its invocation 
    return bar(); //8 
} 
alert(foo()); 

http://jsfiddle.net/jainhimanshu/euga4mcy/
输出为8,但它应该是3

因此,谁能让我清醒的概念。

+2

从本质上讲,你说:'X = 3'然后'X = 8'。那么为什么你期待'x == 3'? – Johan

+0

@Johan对不起,但没有。它永远不会说'x = 3'。第一个函数从未被调用,因为它被第二个函数覆盖。 – Archer

+0

@Archer很好,'bar = 3'然后'bar = 8'然后'return bar' ...正是我所说的和上面写的。 – Johan

回答

4

这是因为您必须调用该函数才能从中获取return值。

功能bar不被调用,它只被定义。

所以,当函数foo()被称为

return bar(); 

foo执行并返回8

编译器看到foo如下(重写bar后):

function foo() { 
    function bar() { 
     return 8; 
    } 

    return bar(); 
} 
alert(foo()); 

当达到return bar(),功能bar被调用,它的返回值。

后的bar

function foo() { 
    return 8; 
} 
alert(foo()); 
+0

嗨@Tushar,我了解提升,但不能够有一件事情,即一个函数如何重写另一个函数定义的定义,并假设如果两个函数的定义不同但名称相同,那么结果如何。请探索 –

+0

@HimanshuJain先前定义的函数被后来覆盖,这就是发生在你的情况 – Tushar

+0

是@Tushar,我明白但是如果函数定义完全不同但是函数名称相同他们早些时候被后来的功能覆盖了 –

0
function foo(){ 
    // .... 
} 

调用创建新Function object,并且受让人命名foo它。它仍然没有被调用,只是被创建,所以任何return语句都不会被触发。

当这个函数内部创建新Functions,像

function foo(){ 
    function bar() { 
    return 3; 
    } 
    return 4; 
} 
// after you execute foo 
console.log(foo()); // will log 4 

但非常重要的是,这个词汇域内,功能bar被创建,但没有在那里执行。又见Lexical scope

但是,当你有一个名为bar这个

function foo(){ 
    function bar(){ 
    return 3; 
    } 
    function bar() { 
    return 8; 
    } 
    return bar(); 
} 
// after you execute foo 
console.log(foo()); // will log 8 

当你执行功能fooglobal范围,它创建函数对象,那么它创建了一个名为bar新的函数对象,旧的被重新定义,与为variable分配新值相同,值更改,但在此上下文中,分配给函数名称的函数体发生了更改。

因为您的功能fooreturn关键字,它会返回该值。它返回的值是返回函数bar的值,因为return bar();将执行函数bar并返回从函数bar收到的值,例如它的值为8。

比较变量的重新定义与功能的重新定义

var a; 
a = "some string"; 
a = 5; // a has value 5, no mater older values 
// same goes for functions 
function bar(){ .... } 
function bar(){ .... } 
function bar(){ .... } 
// invoke bar 
bar(); // last function bar will be executed, no mater other function's bar definitions 
+0

嗨@Nermin,我理解你的观点,但是如果在函数foo中定义的两个函数bar的定义完全不同,那么会发生什么情况呢?将如何重新定义它们以及输出是什么。 –

相关问题