一,作用域
变量的有效范围 . 在一定的空间里可以对数据进行读写操作 , 这个空间就是数据的作用域 .
作用域有分为全局,局部和块级 .
1.全局作用域
最外层函数定义的变量拥有全局作用域 , 即对任何内部函数来说 , 都是可以访问的 .
2.局部作用域
局部作用域一般只在固定的代码片段内可以访问到 , 对于函数外部是无法访问的 , 最常见的例如函数内部 . 在ES6之前 , 只有函数可以划分变量的作用域 , 所以在函数的外面无法访问到函数内部的变量 .
3.块级作用域
凡是代码块就可以划分变量的作用域 , 这种作用域的规则就叫块级作用域 .
3.1 块级作用域 , 函数作用域 和 词法作用域 之间的区别
3.1.1 块级作用域和函数作用域描述的是 , 什么东西可以划分变量的作用域
3.1.2 此法作用域描述的是变量查找的规则.
3.2 关系
3.2.1 块级作用域包含函数作用域
3.2.2 词法作用域与块级作用域,函数作用域之间没有任何交集 ,是从不同角度描述了作用域的规则
二,预解析
JavaScript代码执行时有浏览器中的JavaScript解析器来执行的 . JavaScript解析器执行代码的时候 , 可分为两个过程 : 即预解析和执行过程
预解析过程
- 把函数的变量提升到当前作用域的最前面 , 只会提升声明 , 不会提升赋值 .
- 把函数的声明提升到当前作用域的最前面 , 只会提升声明 , 不会提升调用 .
三,变量提升
变量提升是指定义变量的时候 , 变量的声明会被提升到作用域的最上面 , 变量的赋值不会提升 .
函数提升是指JavaScript解析器首先会把当前作用域的函数声明提前到整个作用域的最前面
使用var关键字定义的变量 , 被称为变量声明 . 函数声明提升的特点是 , 在函数声明的前面 , 可以调用这个函数 .