关于闭包

简单理解就是函数的嵌套形成闭包,闭包包括函数本身及其外部作用域。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

下面是一个简单的闭包:

个人对闭包的理解是允许在一个作用域中访问其自身以外的变量或函数。当函数创建后并执行就会产生作用域(形象的说就是安全气泡)。

闭包(closure)的原理即当函数执行时,解释器会检测该作用域内是否引用除其自身外的变量,若引用了会产生一个闭包对象,并且将该闭包对象封闭在自身作用域中,这样就形成了作用域可以访问除其自身外的变量。

闭包的副作用:会造成内存不释放(垃圾回收器回收)。

当把内部函数交给一个全局变量时,相当于全局变量引用了内部函数,并且内部函数使用了除自身作用域外的变量,此时就会造成闭包对象中的变量不被GC(垃圾回收器)回收。若想回收应该把全局变量的指向清空。因为GC回收机制是靠引用计数判定的(主要就是看该内存地址是否有引用)。【闭包中注意作用域这一概念】

let可自动转为闭包。

说了那么多,那么什么是闭包,为什么要用它?

闭包是指有权访问另一个函数作用域中变量的函数,创建闭包最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用域链,将函数内部的变量和方法传递到外部。

使用闭包主要是为了设计私有的方法和变量。

闭包的优点是可以避免全局变量的污染,使用闭包可以形成独立的空间,延长变量的生命周期,报存中间状态值。

缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄漏。在JS中,函数即闭包,只有函数才会产生作用域的概念。

闭包的特性:1函数内再嵌套函数

2内部函数可以引用外层的参数和变量

3参数和变量不会被垃圾回收机制回收

下面就是一个例子,用闭包实现在li节点的onclick事件都能正确弹出当前被点击的li索引

 

再举一个栗子

执行num667()后,num667()闭包内部变量会存在,而闭包内部函数的内部变量不会存在,使得JavaScript的垃圾回收机制GC不会收回num667()所占用的资源,因为num667()的内部函数的执行需要依赖num667()中的变量。这是对闭包作用非常直白的描述。

posted @ 2016-11-14 14:18  司徒海棠  阅读(391)  评论(2编辑  收藏  举报