作用域是指变量和函数在代码中的可访问范围
作用域链是指在代码中查找变量和函数的过程,当一个变量或函数在当前作用域中找不到时,它会向上层作用域继续查找,直到找到为止,这种层层嵌套的查找关系形成了作用域链。
一、作用域分有全局作用域、局部作用域、块级作用域。
全局作用域
作用于当前所有代码执行的环境(script标签内部)或者一个独立的js文件。
在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量)。任何不在函数中或是大括号中声明的变量,都是在全局作用域下,全局作用域下声明的变量可以在程序的任意位置访问
1、全局变量在代码的任何位置都可以使用。
2、在全局作用域下var声明的变量是全局变量。
3、特殊情况下,在函数内不使用var声明的变量也是全局变量(不建议使用)。
局部作用域
作用于函数内的代码环境,就是局部作用域。因为跟函数有关系,所以也称为函数作用域。
在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量),在局部作用域下声明的函数叫局部函数。
1、局部变量只能在该函数内部使用。
2、在函数内部 var 声明的变量是局部变量。
3、函数的形参实际上就是局部变量。
块级作用域
1、在ES6中新增了块级作用域的概念,使用{}扩起来的区域叫做块级作用域
2、所有用let和const声明的变量符合块作用域。
3、块作用域指非函数的{},if语句和for语句里面的{}也属于块作用域。
4、在块内使用let声明的变量,只会在当前的块内有效。
二、作用域链
1、作用域链:保证对执行环境有权访问的所有变量和函数的有序访问。
2、作用域链是在函数定义的时候就已经产生了,但是并不完整,因为当前函数没有调用,所以当前函数的变量对象还没有产生。
3、当函数调用的时候,会创建当前上下文的变量对象,然后添加在已经生成的作用域链的开始位置,构成完整的作用域链。
4、作用域链的开始位置一定是当前的执行环境的变量对象,结束位置一定是window。
5、变量的解析是沿着作用域链搜索的过程,直到寻找到位置,如果一直找不到,则报错。