【问题标题】:Javascript hoisting confusion [duplicate]Javascript提升混乱[重复]
【发布时间】:2017-01-08 10:11:49
【问题描述】:

我阅读了 Kyle 的 I don't know JS 并了解到函数声明将 hoist 先于 var。所以在下面的代码中

<script>
   foo();
   var a = true;
   if ( a  ) {
          function foo() { console.log( "a"  );  }
   }else {
          function foo() { console.log( "b"  );  }
   }

   foo();
</script>

foo 应该首先被提升并且应该打印“b”作为第一个 foo() 的输出,对吗?还是我错过了什么?

解释或链接以了解代码并在不同场景中提升将有很大帮助。

【问题讨论】:

  • 标准 ES5 JavaScript 语法does not allow function declarations inside blocks。解析此代码的能力需要标准语法的扩展,并且执行行为在 ES5 实现之间有所不同。我不确定最新规范中的当前立场。
  • 在 ES6 之前,块内的函数声明是未定义的行为。 Chrome 和 Firefox 的行为不同(也许他们仍然如此)。在 ES6 中,我相信这些不应该再被提升了。
  • 大声笑,不要再写了。光是看着就眼睛疼。 :)
  • 您已经编写了代码。你为什么不尝试一下?如果你有,你可以有一个更好/不同的理解并提出一个更有针对性的问题(或者更好的是做一些搜索,看看你是否能找到an answer,或two)。
  • 我试过了,没试过我从来没有发过问题。更重要的是,我想了解,所以问社区。无论如何,非常感谢!

标签: javascript hoisting


【解决方案1】:

提升(以您在这里所期望的方式)只有在事物的优先顺序明确时才会起作用。在这种情况下,因为您的函数是在 if 块中定义的,所以不会像您期望的那样提升它。

这将起作用:

  foo();
   var a = true;
   function foo() { console.log( "a"  );  }

   foo();

因为它从等式中删除了您的 if 语句。

【讨论】:

  • 明白了,感谢您的快速解释。
猜你喜欢
  • 2021-01-18
  • 2017-04-22
  • 2013-02-25
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多