函数在条件语句中从javascript中提升

时间:2016-07-02 10:46:56

标签: javascript hoisting

为什么

 var y = 1;
  if (function f(){}) {
    y += typeof f;
  }
  console.log(y); // 1undefined

在运行代码之前,我认为它将是1function

我认为函数提升f后面应该对所有代码都可见。你能提供这种行为描述的链接吗?

P.S>在博客文章中,我发现这个例子有解释

  

输出为1undefined。 if条件语句使用eval求值,因此eval(function f(){})返回函数f(){}(这是真的)。因此,在if语句中,执行typeof f会返回undefined,因为if语句代码在运行时执行,而if条件中的语句在运行时进行评估。

但它并没有使情况更清楚

1 个答案:

答案 0 :(得分:3)

这里的混淆是语法function fName() {}含糊不清,取决于上下文。

单独,它是一个功能声明,因此被悬挂。但在某些情况下,它是(命名的)函数表达式,因此不是。

这就是为什么你看到IIFE声明为(function() {..})()!function() {..}()来强迫它们成为函数表达式而不是声明。

关于命名函数表达式的重要之处在于它们的名称本质上是函数本身的本地名称,并且在该函数之外是不可访问的。这就是+= f在您的代码中添加undefined的原因。

当然,这完全没有意义。为什么有正确思想的人会写这样的代码?所以我想告诉你:https://youtu.be/RAA1xgTTw9w:)