【问题标题】:Why do function declarations get hoisted and function expressions don't?为什么函数声明会被提升而函数表达式不会?
【发布时间】:2019-09-05 06:29:56
【问题描述】:

根据吊装定义:

提升是一种 JavaScript 机制,其中变量和函数 声明在代码执行之前被移动到其作用域的顶部

为什么函数声明会被提升而函数表达式不会?

【问题讨论】:

  • 简单来说,命名变量是hiioisted。在函数表达式中,变量名被提升,但实际函数是稍后分配的值
  • 函数表达式根本不会被添加到作用域中,无论是否被提升。这是因为它们被用作,而不是函数声明,其目的是创建可以通过名称调用的函数。
  • 因为“吊装”不存在。这只是一种理论,旨在简单解释 javascript 的工作原理,但它实际上并不是 javascript 的工作原理。有关正在发生的事情的解释,请参阅我对其他问题的回答:stackoverflow.com/questions/3887408/…
  • 我想这个问题被否决了,因为它实际上并没有寻求帮助。 “为什么[语言 X] 是这样设计的?”对于 SO 来说,问题不是很好的问题,因为它们实际上并不寻求解决技术问题,而且可能非常难以回答,因为它需要了解语言设计者做出决定的原因。
  • @Priyank 如果您要询问实际的技术原因(例如规范方面)为什么它会以这种方式运行,那是另一回事。我建议澄清您的问题,以表明这就是您要问的问题。但是,我怀疑这个问题之前可能已经回答过了。

标签: javascript ecmascript-5 hoisting function-declaration function-expression


【解决方案1】:

根据MDN

例如,从概念上讲,提升的严格定义表明变量和函数声明在物理上移动到代码的顶部,但实际上并非如此。相反,变量和函数声明在编译阶段被放入内存,但准确地保留在您在代码中键入它们的位置。

如您所见,在函数表达式中,实际函数是分配给命名变量的值。所以这个命名变量被提升了。即使你分配了一个命名函数,它仍然不会被提升,因为它不是一个声明,并且会在以后创建。

示例:

function test() {
  console.log(fn, foo);
  
  var fn = function foo() {}
}

test();

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多