【问题标题】:Confusion about Javascript Hoisting [duplicate]关于 Javascript 提升的困惑 [重复]
【发布时间】:2022-01-14 23:34:27
【问题描述】:

我以为我掌握了提升的概念,但下面的代码让我感到困惑。它如何返回 1?第二个 example() 函数会被提升到第一个之上吗?

function example() {
  return 9;
}

console.log(example());

function example() {
  return 1;
}

如果函数声明在编译阶段被提升并且函数表达式在执行阶段被执行。下面的代码怎么会返回 7?仅仅是因为先声明了示例表达式吗?

var example = function() {
  return 7;
}

console.log(example());

function example() {
  return 0;
}

提前谢谢你!

【问题讨论】:

  • 只是将每个function example 声明隐式移动到代码的顶部;替换任何以前的同名function其他所有事情,包括var example = ...,都会在之后发生。这就是提升,完美地解释了这种行为。
  • 所以替换发生了?在第一个示例中,值为 9 的 function example()... 将首先被提升,然后值为 1 的 function example()... 将替换它,对吗?在第二个例子中,我们首先提升function example() ...,然后当var example = ... 执行时,它将替换提升的那个,因此返回7。我理解对了吗?如果我错了,请纠正我。
  • @deceze 虽然你在技术上是正确的(最好的一种正确!),但你说的好像var 没有被提升,它确实如此。我认为更好的答案是函数在 vars 之前被提升。 stackoverflow.com/a/28246653/1497533

标签: javascript hoisting executioncontext


【解决方案1】:

var example = function() 被调用而不是function example() 的原因是提升的顺序。

函数首先被提升,然后是变量声明,每个 ECMAScript 5, section 10.5 指定提升的方式。

在此处阅读更多信息:Order of hoisting in JavaScript

【讨论】:

  • 所以澄清一下,因为function example() 首先被提升,var example = ... 是第二个。 var example = ... 替换了 function example() 对吧?
  • @RomaKim 是的,完全正确。但是,您必须先写var,然后再写function。如果您切换此顺序,它将调用function,因为 var 无法覆盖函数声明。这里有一个很好的例子(带有 g 和 f):stackoverflow.com/questions/28246589/… 请记住,声明与提升不同。
  • 我看过这个例子,但我还是有点困惑。据我了解,function declaration 的提升优先级总是高于function expression。因为var 不能覆盖function declaration,所以如果在'var' 之前声明function declaration 将始终首先记录。在我的第二个示例中,example is 0 在编译阶段,然后var 在执行阶段覆盖它,因此生成example = 7 和控制台日志7。我想我现在明白了。 @LarsFlieger 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-05-06
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多