繁体   English   中英

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

[英]why code after the return statement is reachable in javascript

我是JavaScript的新手,我有一个困惑。
正如我们一直在教的那样,return语句之后的代码不可访问。
但这在以下情况下是不正确的,我无法理解为什么会这样。

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。

所以任何人都可以清除我的概念。

这是因为您必须调用该函数以从中获取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());
function foo(){
  // ....
}

创建新的Function对象 ,并向其分配名称foo 它仍然没有被调用的地方,只是创建的,因此不会触发任何return语句。

在此函数内部时,您将创建新的Functions ,例如

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

但是非常重要的是,在此词法范围内创建了功能bar ,但未在任何位置执行。 另见词汇范围

但是当你有这个

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

global范围内执行函数foo ,它将创建名为bar Function对象,然后创建名为bar新Function对象,旧的对象将被重新定义,与将新值分配给variable ,值更改一样,但是在这种情况下,函数主体为分配给功能名称的更改。

由于您的函数foo具有return关键字,因此它将返回该值。 它返回的值是返回函数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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM