作用域和作用域链

86 阅读1分钟

1.什么是作用域?

作用域就是一个变量可以使用的范围。

作用域可以分为3类:

全局作用域、

函数作用域、

块级作用域。

image.png

如上图,

变量a的作用域是全局,

变量a1的作用域是函数fn1内,

变量a2的作用域是函数fn2内,

变量a3的作用域是函数fn3内。

2.什么是块级作用域?

它是ES6新增的内容,使用关键字let/const声明的变量/常量就会形成块级作用域,

相当于在声明变量的语句外面包裹了一层大括号{}。举个定时器的栗子:

image.png

之所以输出01234,是因为使用let声明的变量,有自己的块级作用域,每次循环的时候,相当于:

image.png

虽然每个变量名称相同,都叫i,但是它们有自己的块级作用域,互不影响。

3.那什么又是作用域链呢?

作用域链就是多个嵌套的作用域形成的由内向外的结构,用于查找变量。

image.png

对于变量a,

先在函数fn3内寻找;

没找到,向上一层fn2内寻找;

没找到,向上一层fn1内寻找;

没找到,继续向上一层全局作用域内寻找,最后找到了变量a。