作用域就是变量的使用范围或者说变量在程序的哪些区域可见。
全局作用域
全局作用域就是window对象。最外层定义的函数,以及定义在最外函数之外的变量都在全局作用域中,同样也是window对象的属性。
函数作用域
就是声明在函数内部的变量以及形参,作用域是分层的外层作用域可以访问内层作用域,反之不行。
块级作用域
由{}包裹的代码块且由let或const声明的变量,可以声明在全局,也可以声明在函数作用域
作用域链
使用方面解释: 当在Javascript中使用一个变量的时候,首先Javascript引擎会尝试在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域,如果在全局作用域里仍然找不到该变量,它就会直接报错。
存储方面解释: 作用域链在JS内部中是以数组的形式存储的,数组的第一个索引对应的是函数本身的执行期上下文,也就是当前执行的代码所在环境的变量对象,下一个索引对应的空间存储的是该对象的外部执行环境,依次类推,一直到全局执行环境
对象方面解释: JavaScript 函数执行时,首先会在自身的 AO 中查找对应属性值,若查找不到,则会去父级的 AO 上找,在查找不到则再去父级的父级查找,直到找到根 window 对象,这样形成的 “AO链” 就是作用域链。