详解闭包和作用域链,那些年我们都不懂的javascript

今天花了一个下午看了看javascript高级那本书,回忆了作用域链和闭包。想想当初自己刚刚学的时候,不知道你们有没有一样的心情,当时我只想说,这什么鬼?这不就是函数递归吗?还需要理解。。。后来我发现我错了,话不多说,开始从基础说

什么是作用域链?

说到这个就要说说执行环境了,从名字可以知道,执行环境就是每到一个函数或者一个变量被调用时,决定了它们的各自行为。并且,每个执行环境都有一个与之相联系的变量对象,这个变量对象不得了,它保存了所有的函数和变量。大概的举个例子:

详解闭包和作用域链,那些年我们都不懂的javascript

上面我创了一个creatA的函数,它的执行环境中的那个变量对象保存了这个函数所有的变量和内部的函数。如变量obj,匿名函数,都保存其中。我假设这个createA的函数变量对象名字是myObject,那么myObject中就保存了变量obj,匿名函数等等与creatA函数的联系,等到需要在执行环境中处理数据时就用到它。

那么作用域链就是每个函数或者变量到自己要被执行时就会被推入执行环境中,此时代码就会创建一个它自己的作用域链。这个链的用途就是保证这个函数身上的变量能够有序访问,就跟排队买蛋挞一样,该到谁领餐了就是谁。是个链子就有前后之分,前面始终是当前代码自己的变量对象,然后就是外部环境中的变量对象。变量对象我前面说了它的用途就是保存了所有的变量或者函数。

现在说说什么是闭包。书中的定义是,闭包指的有权访问另一个函数作用域中的变量的函数。一般来说,一个函数就是一个独立的环境,是不能被访问的。所以闭包,举个例子就是一个家庭中儿子可以吃爸爸的东西,而爸爸不能吃儿子的东西。用代码来说,

详解闭包和作用域链,那些年我们都不懂的javascript

以上意思是一个creatA的函数中有一个匿名函数,那么这个匿名函数就是个闭包,这个匿名函数接收creatA的参数,来比较大小,最后匿名函数被返回;

首先,creatA具有执行环境,匿名函数也有执行环境,全局中也有执行环境

详解闭包和作用域链,那些年我们都不懂的javascript

这个图可以说是我画过的最好看的图啦,哈哈哈哈,这个图明白了差不多就都明白了,多看几遍哟!