[英]Hoisting Declarations vs Expressions in JavaScript
我想了解更多有关何时在 JavaScript 中使用函数表达式与函数声明的信息,并偶然发现了这篇包含以下代码片段的文章:
function foo(){
function bar() {
return 3;
}
return bar();
function bar() {
return 8;
}
}
alert(foo());
令我惊讶的是,由于提升,它的计算结果为8
。 当一个声明被提升时,它是一直移动到函数的顶部(它会在第一个返回 3 的 bar() 之前被提升),还是会在所有其他函数声明之后被提升(它会被提升在返回 3) 的第一个 bar() 之后?
javascript 编译器提升第一个 bar 函数,然后当涉及到第二个函数时,它会覆盖第一个 bar 函数。 这就是为什么我们得到的输出为 8
提升发生在编译阶段,因此在提升期间保留给定范围内的声明顺序。 想象一下,解释器分两次读取代码,第一次它只关心在给定范围内声明的内容,然后第二次实际计算。
这就是您的示例返回8
的原因; 如果bar
的第二个声明在第一个声明之上,则对bar()
的调用将返回3
。
另请参阅:关于提升的 MDN 文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.