码迷,mamicode.com
首页 > Web开发 > 详细

js 闭包

时间:2018-12-12 12:21:06      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:解释   数据结构和算法   值传递   直接   并且   变量   保护   style   fan   

JavaScript 闭包的本质源自两点,词法作用域和函数当作值传递。

词法作用域,就是,按照代码书写时的样子,内部函数可以访问函数外面的变量。引擎通过数据结构和算法表示一个函数,使得在代码解释执行时按照词法作用域的规则,可以访问外围的变量,这些变量就登记在相应的数据结构中。

函数当作值传递,即所谓的first class对象。就是可以把函数当作一个值来赋值,当作参数传给别的函数,也可以把函数当作一个值 return。一个函数被当作值返回时,也就相当于返回了一个通道,这个通道可以访问这个函数词法作用域中的变量,即函数所需要的数据结构保存了下来,数据结构中的值在外层函数执行时创建,外层函数执行完毕时理因销毁,但由于内部函数作为值返回出去,这些值得以保存下来。而且无法直接访问,必须通过返回的函数。这也就是私有性。

 

首先,**闭包**就是指 当函数可以记住并访问所在的词法作用域,并且保持着对词法作用域的引用,即使函数是在当前作用域之外执行,就会形成闭包。

对于闭包的形成,实质上涉及的就是词法作用域和将函数作为值return。

词法作用域是由函数声明时所在的位置决定的,而闭包是词法作用域形成的自然结果。当在函数内部声明了内部函数,并将内部函数作为值返回,就会产生闭包。

 

闭包之所以能访问其外层函数作用域中的变量,是因为闭包的作用域链中存在外层函数的变量对象。即使外层函数之行结束,但由于其变量对象仍然被内层函数的作用域引用,因此不会被内存回收,直到闭包执行结束后,外层函数的变量对象才会被回收。

 

 

简单来说,当一个函数执行的时候,会形成一个私有的作用域,保护里面的私有变量不受外界的干扰或者不干扰外界的全局变量,函数的这种运行机制就叫做闭包。闭包不是具体的某种形式,而是一种机制。

 

通俗地讲就是别人家有某个东西,你想拿到但是因为权限不够(不打死你才怪),但是你可以跟家里的孩子套近乎,通过他拿到!

js 闭包

标签:解释   数据结构和算法   值传递   直接   并且   变量   保护   style   fan   

原文地址:https://www.cnblogs.com/xiaoma-ge/p/10107576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!