js中的作用域--预解析与变量提升

67 阅读2分钟

一,作用域

变量的有效范围 . 在一定的空间里可以对数据进行读写操作 , 这个空间就是数据的作用域 .

作用域有分为全局,局部和块级 .

1.全局作用域

最外层函数定义的变量拥有全局作用域 , 即对任何内部函数来说 , 都是可以访问的 .

2.局部作用域

局部作用域一般只在固定的代码片段内可以访问到 , 对于函数外部是无法访问的 , 最常见的例如函数内部 . 在ES6之前 , 只有函数可以划分变量的作用域 , 所以在函数的外面无法访问到函数内部的变量 .

3.块级作用域

凡是代码块就可以划分变量的作用域 , 这种作用域的规则就叫块级作用域 .

3.1 块级作用域 , 函数作用域 和 词法作用域 之间的区别

3.1.1 块级作用域和函数作用域描述的是 , 什么东西可以划分变量的作用域
3.1.2 此法作用域描述的是变量查找的规则.

3.2 关系

3.2.1 块级作用域包含函数作用域
3.2.2 词法作用域与块级作用域,函数作用域之间没有任何交集 ,是从不同角度描述了作用域的规则

二,预解析

JavaScript代码执行时有浏览器中的JavaScript解析器来执行的 . JavaScript解析器执行代码的时候 , 可分为两个过程 : 即预解析和执行过程

预解析过程

  1. 把函数的变量提升到当前作用域的最前面 , 只会提升声明 , 不会提升赋值 .
  2. 把函数的声明提升到当前作用域的最前面 , 只会提升声明 , 不会提升调用 .

三,变量提升

变量提升是指定义变量的时候 , 变量的声明会被提升到作用域的最上面 , 变量的赋值不会提升 .

函数提升是指JavaScript解析器首先会把当前作用域的函数声明提前到整个作用域的最前面

使用var关键字定义的变量 , 被称为变量声明 . 函数声明提升的特点是 , 在函数声明的前面 , 可以调用这个函数 .