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

ES6模块是否只阻止功能提升?

  •  2
  • Charlie  · 技术社区  · 5 年前

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

    //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 回复  |  直到 5 年前
        1
  •  4
  •   Quentin    5 年前

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

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

    块与吊装无关 风险价值 语句或函数声明(两者都有函数作用域)。它们只为 let const 有阻塞范围的。