1.什么是作用域?
作用域就是一个变量可以使用的范围。
作用域可以分为3类:
全局作用域、
函数作用域、
块级作用域。
如上图,
变量a的作用域是全局,
变量a1的作用域是函数fn1内,
变量a2的作用域是函数fn2内,
变量a3的作用域是函数fn3内。
2.什么是块级作用域?
它是ES6新增的内容,使用关键字let/const声明的变量/常量就会形成块级作用域,
相当于在声明变量的语句外面包裹了一层大括号{}。举个定时器的栗子:
之所以输出01234,是因为使用let声明的变量,有自己的块级作用域,每次循环的时候,相当于:
虽然每个变量名称相同,都叫i,但是它们有自己的块级作用域,互不影响。
3.那什么又是作用域链呢?
作用域链就是多个嵌套的作用域形成的由内向外的结构,用于查找变量。
对于变量a,
先在函数fn3内寻找;
没找到,向上一层fn2内寻找;
没找到,向上一层fn1内寻找;
没找到,继续向上一层全局作用域内寻找,最后找到了变量a。