ES5作用域:
- ES5定义变量通过var
- ES5没有块级作用域的概念
- ES5函数外都是全局作用域
- ES5函数内都是局部作用域
ES6作用域:
- ES6定义变量通过let
- ES6括号外都是全局作用域
- ES6函数内都是局部作用域,无论是var还是let定义都是局部变量
- ES6括号和函数没有结合在一起是块级作用域,通过var定义的变量是一个全局变量,通过let定义的变量是一个局部变量
注意点:无论是在块级作用域还是在局部作用域, 省略变量前面的let或者var就会变成一个全局变量
作用域链:
-
ES5/ES6作用域链 1.1. 全局作用域我们又称之为0级作用域 1.2. 定义函数或{}代码块开启的作用域就是1级/2级/3级/...作用域 1.3. JavaScript会将这些作用域链接在一起形成一个链条, 这个链条就是作用域链 0 ---> 1 ----> 2 ----> 3 ----> 4
-
变量在作用域链查找规则 2.1 先在当前作用域找, 找到就使用当前作用域的 2.2 如果当前作用域中没有找到, 就去上一级作用域中查找 2.3 以此类推直到0级为止, 如果0级作用域还没找到, 就报错