作⽤域和作⽤域链的理解

作⽤域

  • 在ES5中,全局是⼀个作⽤域,函数也会产⽣作⽤域。
  • 在ES6中,代码块、let、const等都会有属于⾃⼰的作⽤域。

作⽤域链

  • 当进⼊到⼀个执⾏上下⽂时,执⾏上下⽂会关联⼀个作⽤域链。
  • 通常作⽤域链在解析时就被确定,作⽤域链与函数的定义位置有关,与它的调⽤位置⽆关

什么是变量提升、函数提升?

变量提升:

  • 简单说就是在js代码执⾏前引擎会先进⾏预编译,预编译期间会将变量声明与函数声明提升⾄其对应作⽤域的最顶端,函数内声明的变量只会提升⾄该函数作⽤域最顶层。

  • 当函数内部定义的⼀个变量与外部相同时,那么函数体内的这个变量就会被上升到最顶端。

  • 举个例⼦,如:

    • console.log(a); // undefined
      var a = 3; // 会将var a 的声明提升⾄最顶端
      

函数提升

  • 函数提升只会提升函数声明式写法,函数表达式的写法不存在函数提升。
  • 函数提升的优先级⼤于变量提升的优先级,即函数提升在变量提升之上。