Js闭包 学习

什么是闭包

SO上的解释:点击打开链接

我的理解,简单的想就是:由于内部函数被外部函数的一个变量引用时,而这个内部函数也要被外部函数引用,就产生了一个闭包环境。

闭包的用处

刚开始看到闭包十分费解.

它的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中


		function a() { 
		 var i = 0; 
		 function b() { alert("i:"+(++i)); } 
		 return b;//这里不能返回b() 否则会出现c is not a function
		}
		var c = a();
		c();//i:1
		c();//i:2
		c();//i:3
		c();//i:4

当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。

这个变量一直在内存中保存。


闭包的应用

闭包的另一个重要用途是实现面向对象中的对象,传统的对象语言都提供类的模板机制,这样不同的对象(类的实例)拥有独立的成员及状态,互不干涉。

虽然JavaScript中没有类这样的机制,但是通过使用闭包,我们可以模拟出这样的机制。

function Person(){  
    var name = "default";     
     
    return {  
       getName : function(){  
           return name;  
       },  
       setName : function(newName){  
           name = newName;  
       }  
    }  
};  
   
   
var john = Person();  
console.log(john.getName()); //default 
john.setName("john");  
<pre name="code" class="javascript">console.log(john.getName());  //john
   
var jack = Person();  
<pre name="code" class="javascript"><pre name="code" class="javascript">console.log(jack.getName());  //default 

jack.setName("jack");  
<pre name="code" class="javascript"><pre name="code" class="javascript">console.log(jack.getName()); //jack
 
 
 
 
 

闭包的释放

由于为了保证引用,变量,参数会一直保存在内存中,直到闭包环境的引用被释放,闭包也就释放了。

john=null;//释放引用
jack=null;//释放引用


闭包的底层

这是某位大神的总结点击打开链接

看的我云里雾里,最后耐心的研究了下,用自己的话来简述下原理吧

首先,由于js的GC一般会回收被占用的资源,正常情况下,a在返回后,就执行结束了。但是闭包的情况比较特殊,他返回的是一个内部函数的引用,而这个内部函数又调用了外部函数a的变量,于是a的引用不被回收,那么GC就会一直为当前的引用保留着这个变量。

其次,函数的作用域在定义这个函数的时候就已经确定了。

“a返回函数b的引用给c,又函数b的作用域链包含了对函数a的活动对象的引用,也就是说b可以访问到a中定义的所有变量和函数。函数b被c引用,函数b又依赖函数a,因此函数a在返回后不会被GC回收。”这句话特别难理解,我也不是很吃透,毕竟对js的底层不是很熟悉。


不知道有么有啥书讲得比较通俗易懂的,先存疑,过一段时间来自问自答吧~





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值