js中只有两种作用域:全局作用域和函数作用域(局部作用域)。
全局作用域只有一个就不必多说了。
函数作用域:创建一个函数就会创建一个函数作用域,相当于创建了一个独立空间,这个空间可以问外部作用域的变量;但是外部作用域不能访问函数作用域的变量。
作用域的最大的用途就是隔离变量,不同作用域中的同名变量互不影响。
在这里先说一个概念:自由变量
什么是自由变量?
下图中,foo中的a,bar中的b,都没有在自己的作用域中声明,像这种变量称之为自由变量。
如上图,全局代码和foo、bar两个函数都会形成一个作用域。而且,作用域有上下级的关系,上下级关系的确定就看函数是在哪个作用域下创建的。例如,foo作用域下创建了bar函数,那么“foo作用域”就是“bar作用域”的父级作用域。
自由变量的访问需要向父级的作用域去寻找,如果父级作用域中找到了就取值并结束,如果没有找到且父级作用域没有找到,那就继续向上找直到全局作用域,如果全局作用域也没有那就取undefined并结束;而自由变量取值的过程中,将作用域串成了一条链子,即作用域链。