在有和没有块作用域的情况下,功能提升显示不同的结果

时间:2019-02-21 04:43:52

标签: javascript function ecmascript-6 scope hoisting

这是示例:

function b() {
  console.log(f); 

  {
    function f() {}
  }
}

b()

我认为它将变成:

function b() {
  // hoist to function scope
  function f() {}
  console.log(f); // should output function f
}

function b() {
  console.log(f); // should output reference error
  {
     // just hoist to block scope like this
     function f() {}
  }
}

,但它输出未定义的内容,例如var提升。为什么?

2 个答案:

答案 0 :(得分:0)

{}创建了块作用域,因此

JS引擎会像这样解释您的代码

function b() {
  console.log(f);
  {
    var f = function f() {};
  }
}

b();

因此,由于f的块作用域范围,无法在块外使用。并且由于它被定义为var,因此被提升到父级的作用域(函数b的作用域),结果是未定义

如果您删除{}

function b() {
  console.log(f); 
  function f() {}
}

b()

答案 1 :(得分:0)

这是由于吊装。 function f() {}在一个块内,因此console.log(f)无法访问function f() {},这超出了范围。但是,如果将console.log(f)保留在块{}中。吊装应该可以。