闭包

定义

当内部函数被保存到外部时,会生成闭包
闭包会导致原有作用域链不释放,造成内存泄漏(泄露过多,内存则变得过少)

两个或多个函数嵌套,内部函数保存到全局时(外部函数的外部),生成闭包

如何让内部函数跑到外部,成立闭包

  • return
  • 操作内部函数,把内部函数赋给全局变量
<script type="text/javascript">
		
		var demo;
		
		function test(){
			
			var abc=111;
			
			function a(){
				console.log(abc);
			}
			demo = a;
		}
		test();
		
		demo();
	</script>

作用

1. 实现公有变量

eg:函数累加器(不依赖于外部变量,且能反复执行)

<script type="text/javascript">
		
		function add(){
			
			var count = 0;
			
			function demo(){
				
				count++;
				
				console.log(count);
			}
			return demo;
		}
		var counter = add();
		
		counter();
		counter();
		counter();
		counter();
		counter();
		counter();
	</script>

2. 可以做缓存(存储结构)

eg:eater;

<script type="text/javascript">

		function eater(){
			
			var food = "apple";
			
			var obj = {
				
				eatFood:function(){
					
					if(food != ""){
						
						console.log("I am eating " + food);
						
						food="";
					}
					else{
						
						console.log("There is nothing!")
					}
				},
				pushFood:function(myFood){
					
					food = myFood;
				}
			}
			return obj;
		}
		var person = eater();
		
		person.eatFood();
		
		person.eatFood();
		
		person.pushFood('banana');
		
		person.eatFood();
		
	</script>

多个函数和一个函数形成一个闭包,变量可以共用,因为大家保存的是同一个域

3. 可以实现封装,属性私有化

    eg:Person( );

4. 模块化开发,防止污染全局变量

问题

<script type="text/javascript">
		
		function test(){
			
			var arr = [];
			
			for( var i = 0; i < 10; i ++){
				
				arr[i] = function(){
					
					document.write(i + " ");
				}
			}
			return arr;
		}
		var myArr = test();
		
		for(var j = 0; j < 10; j++){
			
			myArr[j]();
		}
	</script>

立即执行函数

此类函数没有声明,在一次执行过后即释放,适合做初始化工作

特点: 定义完之后读到这儿立即执行,执行完立即销毁

两种写法:
原理相同,只是数学符号( )优先级更高

(function(){}());
//W3C建议此种写法
(function(){})();
var num = (function(a, b, c){
	
	var d = a + b + c*2 - 2;
	
	return d;
	
}(1, 2, 3))//JS中唯一一个执行完即销毁的函数

与普通函数一样,具有执行期上下文,预编译
只有表达式才能被执行
“表达式 + 执行符号”,与立即执行函数原理一样,一旦表达式被执行,就会失去对原来函数的索引

利用立即执行函数解决上述问题

<script type="text/javascript">
		
		function test(){
			
			var arr = [];
			
			for( var i = 0; i < 10; i ++){
			
				(function(i)
				
				{arr[i] = function(){
					
					document.write(i + " ");
				}
			  })(i);
			}
			return arr;
		}
		var myArr = test();
		
		for(var j = 0; j < 10; j++){
			
			myArr[j]();
		}
		
	</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值