js的作用域存在以下几大类

  • 全局作用域
  • 函数作用域
  • 块级作用域
  • 词法作用域

全局作用域

存在于整个程序生命周期内,var挂载在window顶级对象下, let/const声明的在全局script下

优点:

  • var声明的可以重新声明(更改变量指引)
  • let 不允许重新声明, 更改变量的值
  • const 不允许重新声明,简单类型一旦声明就不能再更改,复杂类型是可以更改变量的值
  • 《三者区别》

    缺点:

  • 命名冲突

  • 会一直占用内存,除非手动垃圾回收

函数作用域

存在于某个函数被声明的范围内,函数内可反问,外部不可直接访问

优点:

相对独立,用完就销毁

缺点:

暂时没太多缺点,想访问函数作用域内的数据,可通过闭包的形式

块级作用域(ES6新增)

动态作用域(this起作用,否则都是词法作用域=静态作用域)