javascript作用域和作用域链

js中只有两种作用域:全局作用域和函数作用域(局部作用域)。

全局作用域只有一个就不必多说了。

函数作用域:创建一个函数就会创建一个函数作用域,相当于创建了一个独立空间,这个空间可以问外部作用域的变量;但是外部作用域不能访问函数作用域的变量。

作用域的最大的用途就是隔离变量,不同作用域中的同名变量互不影响。

在这里先说一个概念:自由变量

什么是自由变量?

下图中,foo中的a,bar中的b,都没有在自己的作用域中声明,像这种变量称之为自由变量。

如上图,全局代码和foo、bar两个函数都会形成一个作用域。而且,作用域有上下级的关系,上下级关系的确定就看函数是在哪个作用域下创建的。例如,foo作用域下创建了bar函数,那么“foo作用域”就是“bar作用域”的父级作用域。

自由变量的访问需要向父级的作用域去寻找,如果父级作用域中找到了就取值并结束,如果没有找到且父级作用域没有找到,那就继续向上找直到全局作用域,如果全局作用域也没有那就取undefined并结束;而自由变量取值的过程中,将作用域串成了一条链子,即作用域链。

 

posted @ 2018-12-13 21:36  独孤之路  阅读(164)  评论(0)    收藏  举报