理解作用域
1. 作用域是什么?
作用域是一套规则
,根据名称查找变量的规则。这个规则决定了,在一块代码区域中,是否能够访问
或者改变
一个变量,换句话来说,这个变量在这个块代码区域中,是否起到了作用。
2. 作用域到底有什么用?
变量的储存、访问、修改是编程语言最基本的能力,那么变量储存在哪里,程序在需要时,又如何找到变量呢,作用域便提供了一套变量的储存和访问的规则。这里还是对定义的解释。
重点就是理解这个规则。为了理解这个规则,请看以下代码。
var a = 2;
这段代码运行的参与者有引擎、编译器、作用域。首先,编译器会将这段代码分成了以下两步。
var a; // 第1步
a = 2; // 第2步
第一步,编译器会询问作用域,是否有一个变量名为a的变量存在作用域中,不存在,编译器就要求作用域声明一个变量名为a的变量;存在,编译器就忽略该声明,继续编译。
第二步,编译器为引擎生成了这段要执行的代码,执行代码时,引擎会询问作用域,是否有个变量名为a的变量存在作用域中,存在,就是使用这个变量;不存在,就继续查找该变量(实际就是沿着作用域链向上查找)。
深入理解请参考你不知道的JavaScript上卷1.2。
3. JavaScript采用的是词法作用域模型
词法作用域就是定义在词法阶段的作用域,意思就是,在编码的时候,作用域就是确定了,不会再发生变化了。
4. 作用域的分类
- 全局作用域
- 能在全局范围内访问和使用
- 函数作用域
- 属于一个函数的全部变量都可以在整个函数的范围内使用
- 块级作用域
- 变量和函数不仅可以属于所处的作用域,也可以属于某个代码块(通常指{..}内部)
5. 什么是作用域链?
当一个函数或块嵌套在另一个块或者函数中是,就发生了作用域的嵌套。如果在当前整个作用域中找不到某个变量时,引擎就会在外层的作用域中继续查找,直到找到该变量或者找到了最外层的作用域仍找不到而终止。由此,生成了一个由内向外的结构,来用于查找变量,就是作用域链。
不是知识本身抽象,只是时机未到。