ES6块仅阻止功能提升吗?

时间:2019-06-20 16:23:22

标签: javascript scope hoisting

请有人帮助我了解以下情况:

//Outer funtion 
function foo() {
  console.log('outer foo');
}

{
  //Inner function
  function foo() {
    console.log('inner foo');
  }
}

foo(); //Says "inner foo"

我假设在上述情况下,执行该块后,内部函数的显式减速度将替换提升的外部函数。

这是否意味着ES6块仅在内部声明时才阻止函数提升?

更新

许多人认为这些功能块不起作用。但是,请按照MDN查看以下情况-

foo('outside');  // TypeError: foo is not a function
{
  function foo(location) {
   console.log('foo is called ' + location);
  }
  foo('inside'); // works correctly and logs 'foo is called inside'
}
     

更准确地说,block语句阻止了该功能   声明从提升到范围的顶部。功能   表现得好像被定义为函数表达式,并且   这样,只有隐式变量声明被吊起   到范围的顶部

另一个更新

文档是错误的,只是由提供所选答案的专家修复的。

1 个答案:

答案 0 :(得分:4)

  

我假设在上述情况下,执行该块后,内部函数的显式减速度将替换提升的外部函数。

函数声明,如var语句,在执行函数中的代码之前,在对函数进行初始扫描期间被提升到函数的顶部。

块与var语句或函数声明(两者均具有函数作用域)的提升无关。它们仅对具有块作用域的letconst至关重要。