代码之家  ›  专栏  ›  技术社区  ›  Noitidart

在if块中提升命名函数

  •  -1
  • Noitidart  · 技术社区  · 7 年前

    我以为所有的功能和他们的身体都被吊起来了。我做了这个测试:

    foo();
    var blah = true;
    if (!blah) function foo() { console.log('falsy') }
    else function foo() { console.log('truthy') }

    foo 不是函数。它似乎在制造 一个变量及其声明被挂起。但直到 if 声明。

    1. 最后 function foo
    2. 我没看见 ReferenceError: foo is not defined TypeError: foo is not a function
    2 回复  |  直到 7 年前
        1
  •  1
  •   Blue    7 年前

    首先,在定义函数foo之前调用它。blah的值在那里还没有定义。但如果你所说的吊死是什么意思的话,它已经在全球范围内了。

    第二,foo实际上是被定义的,因为 var 和 function 之前 在预处理阶段执行。所以在电话上 foo() ,foo已定义但未初始化,因为它是在尚未处理的条件下初始化的。

    "use strict"; 顶部声明

        2
  •  0
  •   Adrian Brand    7 年前

      if (!blah) {
        function foo() { console.log('falsy') }
      } else {
        function foo() { console.log('truthy') }
      }
    

    如果您这样格式化它,您将看到两个foo,它们的作用域在括号内。

    hello();
    {
      function hello() {
        console.log('hello');
      }
    }