作用域(scope),是指变量的生命周期(一个变量在哪些范围内保持一定值)。
- 全局作用域
- 函数作用域
- 块级作用域
- 词法作用域
- 动态作用域 动态作用域跟 this 引用机制相关
全局作用域
1 | 全局变量: |
- 显式声明:
带有关键字 var 的声明。 - 隐式声明:
不带有声明关键字的变量,JS 会默认帮你声明一个全局变量!!!
函数作用域:
函数作用域内,对外是封闭的,从外层的作用域无法直接访问函数内部的作用域!!!
1 | function bar() { |
块级作用域:
- 在
ES6
之前,是没有块级作用域的概念的。
1 | for(var i = 0; i < 5; i++) { |
用 var
关键字声明的变量,在 for
循环之后仍然被保存这个作用域里。
- 如果想要实现
块级作用域
那么我们需要用let
关键字声明!!!
1 | for(let i = 0; i < 5; i++) { |
在 for
循环执行完毕之后 i 变量就被释放了,它已经消失了!!!
- 同样能形成块级作用域的还有
const
关键字:
1 | if (true) { |
let
和 const
关键字,创建块级作用域的条件是必须有一个 { } 包裹。
词法作用域:
当我们要使用声明的变量时:JS引擎总会从最近的一个域,向外层域查找。
1 | var testValue = 'outer'; |
当 JS 引擎查找这个变量时,发现全局的 testValue 离得更近一些,这恰好和 动态作用域
相反。
动态作用域:
1 | 动态作用域,作用域是基于调用栈的,而不是代码中的作用域嵌套; |
同样是,词法作用域,同一份代码,如果是,动态作用域:
1 | var testValue = 'outer'; |