什么是闭包?
分类:javascript
什么是闭包?
-
闭包的含义就是闭合,简单的说就是一个具有封闭风格与包裹功能的一个结构,所以闭包就是一个具有封闭对外不公开的包裹结构或空间
-
在js中函数可以构成闭包,即一个函数是一个代码结构的封闭结构,即包裹的特性。根据作用域规则,只允许函数访问外部的数据,外部无法访问函数内部的数据,即封闭的对外不公开的特性,因此说函数可以构成闭包
举个例子:var foo = (function(){return {}或者 return function(){}})()
闭包要解决的问题
- 闭包不允许外界访问
- 要解决的问题就是直接或间接的范围内部数据
函数可以构成闭包,解决的问题就是外部可以访问函数内部的数据
- 函数内部的数据直接return 是可以访问到函数内部的数据的,但是该数据不能第二次访问,因为第二次访问的时候又要调用一个函数,表示会有一个新的数据出来
- 在函数内部的数据,不能直接被函数外部访问,所以在函数内部定义一个函数,那么这个内部函数是可以直接被访问的(即访问闭包中的数据)
- 0 级俩无法访问1级链中的数据,所以可以通过操作2级链来访问1级链的数据
闭包的基本结构
-
一般闭包的问题就是要使用访问间接的获取函数内部数据的使用权:
有2个基本使用模型
- 写一个函数,函数内部定义一个新函数,返回这个新函数,利用函数获取内部的数据
- 写一个函数,函数内部定义一个对象,对象中绑定多个函数,返回对象,利用对象的方法访问函数内部的数据
闭包的基本用法
- 闭包是为了实现具有私有访问空间的函数
- 带有私有访问数据的对象
- 私有数据,就是值有函数内部可以访问的数据,或对象内部的方法可以访问的数据
- 带有私有数据的函数
闭包的性能问题
- 函数执行需要内存,那么函数定义的变量,会在函数执行结束后自动回收(即垃圾回收),凡是因为闭包被引出的数据,如果还有变量在引用,这些数据就不会被回收。,
- 引出使用闭包的时候,如果不使用某一些数据了,一定要给他赋值一个NULL(IE浏览器一定要写)
- 函数运行需要内存,函数运行结束,内存回收
- 闭包中的数据被外界访问后,函数执行结束后不能将其回收,如果闭包过过,会造成内存泄露(即闭包中的数据被访问后不会被回收,如果闭包过多,数据一致堆叠在内存中,会找出内存泄露)(所以有一些数据不在使用的时候,如果有变量还在引用这个数据,就把这个变量赋值为空)