JS的作用域、预解析和声明提升

作用域

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

1、全局作用域:

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

2、局部作用域:

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

3、块级作用域:

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

块级作用域 函数作用域 词法作用域之间的区别:

3.1)块级作用域和函数作用域描述的是,什么东西可以划分变量的作用域
3.2)词法作用域描述的是,变量的查找规则
之间的关系:
1、 块级作用域 包含 函数作用域
2、 词法作用域 与 块级作用域、函数作用域之间没有任何交集, 他们从两个角度描述了作用域的规则
ES6 之前 JavaScript 采用的是函数作用域+词法作用域,ES6 js 采用的是块级作用域+词法作用域

预解析

JavaScript 代码的执行是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器执行 JavaScript 代码的时候,分为两个过程:预解析过程和代码执行过程

预解析过程都发生了什么?

  1. 将变量的声明提升到作用域的最前面,只会提升声明,不会提升赋值。
  2. 将函数的声明提升到作用域的最前面,只会提升声明,不会提升调用。
  3. 函数提升的优先级大于变量提升的优先级
// 因为var先提升,所以此处的fn是函数fn
console.log(fn);// [Function: fn]
function fn (){
  return 'fn'
}
var fn = 'aaa'

声明提升

如上面代码,使用var关键字声明的变量,或者使用函数声明创建的函数,可以先使用后声明。
需要注意的是,使用函数表达式的写法创建的函数,不会存在声明提升

// 函数表达式
var fn = function(){
    return 'fn'
}