这里不再码任何代码,关于js闭包的解释(作用域从上至下巴拉巴拉)和表现形式(可以获取到父作用域内定义的的元素巴拉巴拉)以及作用(模块化)网上已经够多,这里我个人对原理认识的角度来谈一下闭包。
首先要对js函数的scope属性有一定了解,在我的另一篇文章里面有提到 js函数的执行过程点击打开链接,当函数被执行时,会根据scope(存储了当前函数被定义时的作用域链)创建一个由上至下的活动对象(存储了当前作用域内定义的变量引用,例如最上级的window的活动对象内存储了全局环境下定义的各种变量)的“链”(举个不是很恰当的例子,想像一下缆车,每个缆车是活动对象,然后缆车线是把他们关联起来的“作用域链”),最上层的活动对象即为全局对象(window/global),最下层的活动对象即为当前执行函数的活动对象,作用域链会将活动对象一级一级关联起来(所以可以一层一层向上查找),正常情况下,当函数执行完毕,这些活动对象都会被gc掉,但是当有闭包的情况下,会出现一个对闭包函数的引用,进而闭包函数不会被销毁,闭包函数的作用域链对其他活动对象的引用依然存在,所以由于存在引用关系,闭包函数的作用域链所引用的活动对象都不会被销毁,所以闭包函数依然可以获取到那些活动对象内的值,进而达到了我们一般理解中闭包的效果。
纯属个人理解,欢迎纠错。