为什么在javascript中可以访问return语句之后的代码

时间:2015-09-09 09:32:07

标签: 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 个答案:

答案 0 :(得分: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());

答案 1 :(得分: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

但是当你有这个

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

foo范围内执行函数global时,会创建名为bar的Function对象,然后创建名为bar的新Function对象,重新定义旧对象,与为variable分配新值相同,值更改,但在此上下文中,分配给函数名称的函数体已更改。

由于您的函数foo具有return关键字,因此会返回该值。它返回的值是返回函数bar的值,因为return bar();将执行函数bar并返回它从函数bar接收的值,例如它是值8。 / p>

将变量重定义与函数重定义进行比较

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