闭包

闭包

闭包的概念:

  • 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境表达式(通常是一个函数),所以这些变量也是该表达式的一部分.(函数就是一个表达式)
  • 通俗的来说:JavaScript中所有的function都是一个闭包,但嵌套的function所产生的闭包的作用更强,也是我们通常认为的"闭包".

什么是闭包:闭包是指在函数外部能够访问函数作用域中变量(局部变量)的函数;

  • (或者说闭包就是能够读取其他函数内部(局部变量)变量的函数;或者说闭包是指有权访问另一个函数作用域中的变量(局部变量)的函数;由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。
    )

闭包的代码(格式)

闭包的格式:外层函数嵌套内层函数,内层函数作为外层函数的return语句的返回值。

function f1(){
	var n = 250;
	function f2(){//f2定义在f1的内部,可以读取f1的局部变量;
		alert(n);
	}
	return f2;//返回f2的目的是外部可以调用f2函数,不至于因为f2函数定义在f1内部,而导致外部不能调用。这样就相当于f2还是可以在外部调用的,巧妙地,在f2里面使用了f1的局部变量。实现了上面代码同样的效果
}
  • 以上代码中f2就是闭包.f2里可以读取f1的局部变量.
  • 以上代码调用f2有两种写法:
//方法一
var f=f1();
f()
//方法二
(f1())();

闭包的作用

  • 可以读取函数内部的变量(局部变量)
  • 可以让这些变量的值始终保持在内存中.
function f1(){
	var n = 1;
	function f2(){
	      n++; 
	      alert(n); 	
	 }
	f2();//在f1的作用域范围内调用f2,肯定能够显示出n的值,这是正常的。
	return f2;
}
var f = f1();//f是全局变量
f();//但是,在f1之外调用f2时,也能正确显示出f1里给n赋的值,这就是使得变量n一直保存在内存中了。原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

闭包的注意点

  • 由于闭包会使得函数中的变量都被保存在内存中,造成内存的浪费,所以不能滥用闭包,可能导致内存泄漏(有些内存不再使用了,但是没有被释放.)

闭包的示例

  • 循环嵌套时,打印99乘法表
function outerFunc(){
      for(var i=1;i<=9;i++){
 			(function(maxCount){
    	       	for(var j=1;j<=maxCount;j++){															document.write(j+"*"+maxCount+"="+maxCount*j+"&nbsp;&nbsp;")
	       }
	})(i);
	document.write("<br>");
      }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值