简介
介绍:限制JS声明的名字的有效范围,称为作用域
作用:提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突,防止变量污染
变量的访问原则:
- 只要是代码,就至少有一个作用域
- 写在函数内部的是局部作用域
- 如果函数中还有函数,那么在这个作用域中就又可以诞生一个新的作用域
- ==在能够访问到的情况下 先局部, 局部没有在找全局==
- 就近原则
全局作用域
介绍:<script> 标签 和.js文件 的【最外层】就是所谓的全局作用域,在此声明的变量在函数内部也可以被访问。
- 全局作用域中声明的变量,任何其它作用域都可以被访问
注意:
为 window 对象动态添加的属性默认也是全局的,不推荐!
函数中未使用任何关键字声明的变量为全局变量,不推荐!!!
尽可能少的声明全局变量,防止全局变量被污染
全局变量
介绍:全局变量在任何区域都可以访问和修改
注意:==变量没有声明,直接赋值,也当全局变量看==
局部作用域
函数作用域
介绍:在函数内部声明的变量只能在函数内部被访问,外部无法直接访问
简单说就是在函数里声明的变量,数组,对象... 在当前函数外部无法使用
- 函数执行完后,声明的变量就被清空了
局部变量
介绍:也称为函数作用域,函数内部有效
注意:函数内部的形参可以看做是局部变量
块作用域
介绍:被{ } 包裹的代码称为代码块,代码块内部声明的变量外部将【有可能】无法被访问(==ES6新增==)
- 只要使用
let和const声明的都是 块级作用域
注意:
- var不会产生块作用域
- 不同代码块之间的变量无法互相访问
作用域链(就近原则)
介绍:作用域链本质上就是==变量查找机制==
总结:作用域链其实就像是链子一样,从小到大依次查找的一种规则
作用域链是如何查找的:
- 在函数被执行时,会优先查找当前函数作用域中查找变量
- 如果当前作用域查找不到则会依次逐级查找父级作用域直到全局作用域
注意:子作用域可以访问父级作用域,父级作用域无法访问子级作用域