闭包

什么是闭包

闭包是函数的代码在运行过程中的一个动态环境,是一个运行期的动态概念。

  • 闭包作为与函数成对的数据,在函数执行过程中处于激活状态。
  • 闭包在函数运行结束后,保持运行过程的最终数据状态。

函数引用,多个变量可引用同一个函数

function myFun(){
    //...
}
var f1 = myFun();
var f2 = myFun();
console.log(f1===f2);  //true

下面这种也可以产生同一个函数的引用

var f = function(){
   var myFun = function()
       {
       //...
       }
   return function(){
      return myFun;
   }
}() 
//其实等价于
var f = function{
  //...
}
var f3 = f();
var f4 = f();
console.log(f3===f4);  //true

多个函数实例引用,函数实例代码块相同

function MyObject(){
			function fun(){
			
			}
			
			this.doFun = fun;
		}
		
		var obj1 = new MyObject();
		var obj2 = new MyObject();
		
		console.log(obj1.doFun===obj2.doFun);   //false 表明是不同的函数实例
		console.log(obj1.doFun.toString()===obj2.doFun.toString()); //true
		
		console.log("===========================================");
		
		//以下证明非 new 关键字,也能产生多个函数实例
		function myFun(){
			function fun(){
			
			}
			this.doFun = fun;
		}
		var obj = new Object();
		//1.进入myFun,取 fun 的一个实例
		myFun.call(obj);
		var f1 = obj.doFun;
		//2.再次进入 myFun,取 fun 的一个实例
		myFun.call(obj);
		console.log(f1===obj.doFun);  //false 表明是不同的函数实例
		console.log(f1.toString()===obj.doFun.toString()); //true

怎样产生函数实例

闭包是对应用于函数实例的,因此我们只要分析哪些情况下产生函数实例,就可以清楚知道运行的闭包环境

                //例一、下面对象的实例支持有原型中的方法的一个引用,因此也不产生函数的实例
		function MyObject(){
			//...
		}
		MyObject.prototype.method = function (){ 
			//...
		}
		var obj1 = new MyObject();
		var obj2 = new MyObject();
		
		console.log(obj1.method===obj2.method); //true

                //例二、下面对象可以产生函数的实例
		function MyObject(){
		        function fun(){
			
			}	
			this.doFun = fun;
		}
		var obj1 = new MyObject();
		var obj2 = new MyObject();
		
		console.log(obj1.doFun===obj2.doFun); //false

函数中将内部函数作为返回值也可以产生函数实例

		function Fun(){
			function myFun(){
				//...
			}
			
			return myFun;
		}
		
		var f1 = Fun();
		var f2 = Fun();
		
		console.log(f1===f2); //false


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值