1.1什么是作用域
一个变量的可用范围
1.2为什么
避免不同范围之间的变量互相干扰
1.3js中包括2级
1.3.1全局作用域:
1.3.1.1什么是全局作用域
在程序的任何位置都能访问到的范围
1.3.1.2全局作用域保存着什么
全局变量——任何位置都能访问
1.3.1.3全局作用域包括什么
一切不属于任何函数和对象的变量和函数
1.3.2函数作用域
1.3.2.1 什么是函数作用域
函数{}范围内才能访问的区域
1.3.2.2 函数作用域保存着什么
局部变量——函数{}范围内才能访问
1.3.2.3 强调
只有函数的{},才能形成作用域!只要不是函数的{},都不是作用域
1.3.2.4局部变量包括2种情况
在函数内var创建的变量
函数的形参变量默认就是局部变量(虽然没有var)
1.4作用域的原理: 4个阶段
定义函数时:
- 每个函数对象身上都有一个"好友列表"
- 普通函数的好友列表只有两个格子。
- 离自己近的格子,暂时为空,预留
- 离自己远的格子,保存window对象的引用关系。
调用函数时:
- 临时创建函数作用域对象,并将函数作用域对象的地址,保存到好友列表中离函数近的格子里。
- 在函数作用域对象中临时添加函数的局部变量
调用函数过程中:
- 每用到一个变量,js引擎都会先在离自己近的函数作用域对象中查找使用。如果函数作用域对象中找到了想要的变量,则不再去全局找
- 如果函数作用域对象中没有找到想用的变量,js引擎就会延好友列表继续去全局查找变量使用。
- 总结: 变量的使用遵循就近原则
函数调用后:
- 清空好友列表中离函数近的格子
- 导致临时函数作用域对象释放
- 导致所有局部变量一同释放!
——所以局部变量在函数调用后都不可用!
1.5作用域链:
- 什么是: 函数对象身上自带的,保存一个函数可用的所有作用域对象的链式结构/数组。
- 保存着一个变量可用的所有局部变量和全局变量
- 控制着变量的使用顺序: 就近原则: 先局部,后全局