js闭包

<!DOCTYPE HTML>  
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>闭包初次接触</title>
		<script type="text/javascript">
		var n=999;
		function f(){
			alert(n);
		}
		f();
		function f2(){
		  var	m=999; //一定要使用var命令。如果不用的话,你实际上声明了一个全局变量! 
		}
		//m is not defined
		//alert(m);  //此处:外部是获取不到函数内部的局部变量的
		function f22(){
			k=777; //没有用var,则是全局变量
		}
		f22();
		alert(k);
		//那么怎么获取到函数内部的局部变量呢?----闭包
		//闭包:定义在一个函数内部的函数,就是能够读取其他函数内部变量的函数。 
		function f3(){
			var p=888;
			function f4(){
				alert(p);
			}
			return f4;//
		}
		var result=f3();
		result();
		//闭包可以用在许多地方。它的最大用处有两个,
		//一个是前面提到的可以读取函数内部的变量
		//另一个就是让这些变量的值始终保持在内存中。 
		
		</script>
    </head>
    <body>
	
	</body>
</html>

 

<!DOCTYPE HTML>  
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>匿名函数和闭包</title>
		<script type="text/javascript">
		//另一个就是让这些变量的值始终保持在内存中。 
	      function f(){
			var n=999;
			nAdd=function(){n+=1;}//匿名函数,本身就是个闭包,没有var,是个全局变量
			function f2(){
				alert(n);
			}
			return f2;
		  }
		  var result=f(); //返回局部变量n的值
		  result();
		  nAdd();  //n+1后返回1000,说明n一直在内存中
		  result();
		
		</script>
    </head>
    <body>
	
	</body>
</html>

 

<!DOCTYPE HTML>  
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>闭包使用</title>
		<script type="text/javascript">
		var name="The Window";
		var object={
			name:"My Object",
			getNameFunc:function(){
				return function(){
					return this.name;				}
			}
		}
		alert(object.name);
		alert(object.getNameFunc()());
		</script>
    </head>
    <body>
	
	</body>
</html>

 

<!DOCTYPE HTML>  
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>闭包使用</title>
		<script type="text/javascript">
		function outerFun(){
			var a=0;
			function innerFun(){
				a++;
				alert(a);
			}
			return innerFun;
		}
		var obj=outerFun();
		obj();
		obj();
		var obj2=outerFun();
		obj2();
		obj2();
		</script>
    </head>
    <body>
	
	</body>
</html>

 

<!DOCTYPE HTML>  
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>闭包使用</title>
		<script type="text/javascript">
		function outerFun(){
			var a=0;
			alert(a);
		}
		var a=4;
		outerFun();
		alert(a);//结果是 0,4 .  因为在函数内部使用了var关键字 维护a的作用域在outFun()内部. 
		
		function outerFun2(){
			a=0;//没有var
			alert(a);
		}
		var a=4;
		outerFun2();
		alert(a);//结果为 0,0 真是奇怪,为什么呢?
		//作用域链是描述一种路径的术语,沿着该路径可以确定变量的值 .
		//当执行a=0时,因为没有使用var关键字,
		//因此赋值操作会沿着作用域链到var a=4;  并改变其值. 
		</script>
    </head>
    <body>
	
	</body>
</html>

 

posted @ 2017-02-19 17:42  幸福安康  阅读(107)  评论(0编辑  收藏  举报