ES6 块级上下文

除了函数和对象的大括号外,如[判断体/循环体/代码块...],如果大括号中出现了let/const/function/class等关键词声明变量,则当前大括号会产生一个块级私有上下文,它的上级上下文是所处的环境

    // @1 产生EC(G)
    // @2 函数声明提升:不论条件是否成立,判断体中的function会进行函数声明提升,但是只声明不定义[function foo],GO上有个foo 
    // @3 执行代码
    console.log(foo) // undefined

    if (1 === 1) {
      // @1 执行代码时,判断体中遇到let/const/function/class会形成块级私有执行上下文 EC(BLOCK)
      // @2 函数声明提升 function foo() { }, VO(BLOCK)上有个变量foo->0x001
      // @3 执行代码
      console.log(foo) // foo(){}
      function foo() { } // 按照道理讲已经在函数声明提升阶段处理过了,会跳过处理,但是这边需要同步给EC(G),GO的foo->0x001,而此行代码之后的代码和EC(G)无关
      foo = 1 //  VO(BLOCK)上有个变量foo->1
      console.log(foo) // 1
      
      // 块级执行上下文没有自己的this,所以它是找的外层this
      console.log(this); // window
    }
    console.log(foo) // foo(){}

你可能感兴趣的:(ES6 块级上下文)