JS闭包原理分析

我怕爱的太早我们不能终老 提交于 2020-02-23 03:29:34

JS闭包原理分析
闭包是指有权访问另一个函数作用域中的变量的函数。在一个函数A内部返回另一个函数B,并且函数B里面使用者A函数内部的私有变量,此外在函数A外面定义一个变量接收函数B,这样就形成了闭包。
比如在一栋房子里面有很多个小房间,你手上通过拿着一个小房间的地址(xxx栋001房),那么通过小房间的地址就可以找到这栋房子,进入里面。
函数都有自己的执行环境,该环境定义了变量或者函数访问数据的权限。JS 在运行的时候,会为每一个执行函数分配内存空间,我们称这个空间为作用域对象(Scope Object)。当调用函数时,函数中分配的本地变量会被存储在这个作用域对象中。当函数执行了之后,该空间会被销毁,该空间内的变量也会被销毁。
在这里插入图片描述
函数作用域对象是按顺序访问的,最先能够访问的是当前函数的作用域,如果访问的变量在当前作用域没有,会访问上一层作用域,直到找到全局作用域(Global)对象。如果访问到全局作用域也没有这个对象,会抛出ReferenceError的异常。这就是所谓的作用域链(scope chian)。
在这里插入图片描述
闭包之所以能够访问到上一层函数中的局部变量,是因为当变量被捕获之后,即使上一层函数调用完毕出栈了,但是它的作用域对象没有被销毁,所以仍然能够被闭包访问。
在这里插入图片描述
在函数内部返回一个函数,并且在外部定义一个全局变量接收这个返回的函数,该变量存储的实际上是返回的函数的存储地址,那么函数fn2的执行空间不会被销毁,因为在外面有变量存储函数fn2执行空间里面返回函数的地址,通过该地址可以找到函数fn2的执行空间,所以可以在外部访问到函数fn2里面的变量i。
在这里插入图片描述
以上就是闭包的基本原理。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!