什么是作用域
变量生效的范围
变量不是在所有地方都是可以使用的,而这个变量的可使用范围就是作用域
全局作用域
最大的作用域 在全局作用域中定义的变量可以在任何地方使用
页面打开时浏览器给我们生成了一个全局作用域
window这个作用域一直存在,直到浏览器页面关闭时才会销毁
局部作用域
局部作用域就是在全局作用域内的某一个地方,相对比较小的一些作用域
在局部作用域中定义的变量只能在当前的这个作用域内部使用,在全局作用域或者其他的局部作用域中不可以使用
在 JS 中,只有 函数 能生成一个局部作用域,每一个函数内部都是一个局部作用域
var num = 100 // 全局作用域下声明的变量,在任何地方都可以使用
function fn() {
var num = 200 // 局部作用域下声明的变量,只能在fn函数内部使用
}
块级作用域
必须使用 let 或者 const 声明变量的时候,才会出现块级作用域
{} 之内的取余就是块级作用域
在当前作用域声明的变量或者函数,一旦超过了当前作用域的范围就不能使用了
文件作用域
必须使用模块化开发才能出现所谓的文件作用域
每一个文件都是一个独立的作用域,不能访问文件之外的其他文件内的变量或者函数
除非利用模块化的导入导出
作用域链
作用域链是一个纯概念性的东西
当我们在某一个作用域内获取某一个变量时,会先在作用域查找,找到直接拿来用,没找到会向上层查找。如果上层作用域也没找到,那么会继续向上层作用域的上层作用域查找,一直查到全局作用域
这样一层一层向上查找构成一个链条(假设),我们叫做作用域链
var num = 100
function fn() {
var num2 = 200
function fun() {
var num3 = 300
console.log(num3) // 自己作用域就有(fun内部),可以直接用
console.log(num2) // 自己作用域没有(fun内部),去上一层查找(fn内部)有
console.log(num) // 自己作用域没有(fun内部),去上一层查找(fn内部)没有,去全局作用域查找
console.log(a) // 一直到全局作用域都没有,报错
访问规则
变量的访问规则也叫做作用域的查找机制
作用域的查找机制只能向上查找不能向下查找
赋值规则
当我们想要给某一个变量赋值的时候,就要先找到这个变量,然后再给他赋值