韩顺平 javascript教学视频_学习笔记20_多态经典案例_补讲闭包细节

  • 多态经典案例



经典案例,看代码:

<html>  
	<head>  
		<script language="javascript">  
			
			function Master(){
				//给动物喂食
				this.feed=function(animal,food){
				
					window.alert(animal.constructor);
					document.write("主人给 "+animal.name+" 喂食 "+food.name+"<br/>");
				}
			}
			
			//写食物
			function Food(name){
				this.name=name;
				//...
			}
			function Fish(name){
				this.food=Food;
				this.food(name);
			}
			function Bone(name){
				this.food=Food;
				this.food(name);
			}
			function Taozi(name){
				this.food=Food;
				this.food(name);
			}
			
			//动物
			function Animal(name){
				this.name=name;
			}
			function Cat(name){
				this.animal=Animal;//对象冒充
				this.animal(name);
			}
			function Dog(name){
				this.animal=Animal;//对象冒充
				this.animal(name);
			}
			function Monkey(name){
				this.animal=Animal;//对象冒充
				this.animal(name);
			}
			
			var cat=new Cat("小猫咪");
			var dog=new Dog("小狗");
			var fish=new Fish("小鱼");
			var bone=new Bone("骨头");
			
			var master=new Master();
			master.feed(cat,fish);
			
			master.feed(dog,bone);
			
			master.feed(new Monkey("小猴"),new Taozi("桃子"));
 
		</script>  
	</head>  
	<body></body>  
</html>  

  • 闭包 ----什么是闭包

闭包(closure)
javascript闭包就是在另一个作用域中保存了一份它从上一级函数或作用域取得的变量(键值对),而这些键值对是不会随上一级函数的执行完成而销毁。

<html>  
	<head>  
		<script language="javascript">  
			
			//闭包 closure
			function a(){  
				var i=0;  
				function b(){  
					alert(++i);  
				}  
				return b;  
			}  
			//闭包和GC有关系
			a();//此时,内存中会给i分配一个空间,当运行完a()后,GC就把i的空间当作了垃圾
			var c=a();   //当把 a() 赋给c后 ,GC没有把 i 的空间当作垃圾,因为他认为后面可能c还会用到i这个值,就不会把i的空间当作垃圾
			c();  // 返回 1
			c();  //返回 2,更能说明 i 的空间没有被当作垃圾来回收
 
		</script>  
	</head>  
	<body></body>  
</html>  

这样在执行完var c=a()后,变量c实际上是指向了函数b,b中用到了变量i,再执行c()后就会弹出一个窗口显示 i 的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内部的函数b
就是说:
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的闭包。
闭包的作用:就是在a执行完并返回后,闭包使得javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。
进一步对闭包解释:

  1. 闭包和gc是相关联的
  2. 闭包实际上是涉及到一个对象的属性,何时被gc处理的问题
  3. 怎样才能对对象的属性形成一个闭包(看上面的案例)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值