论坛首页 入门技术论坛

JS 闭包

浏览 26074 次
锁定老帖子 主题:JS 闭包
该帖已经被评为新手帖
作者 正文
   发表时间:2009-03-15   最后修改:2009-03-15
		function outerFun()
			{
				var a=0;
				function innerFun()
				{
					a++;
					alert(a);
				}				
			}
			innerFun()

 上面的代码是错错误的.innerFun()的作用域在outerFun()内部,所在outerFun()外部调用它是错误的.

 

 

改成如下,也就是闭包:

			function outerFun()
			{
				var a=0;
				function innerFun()
				{
					a++;
					alert(a);
				}
				return innerFun;  //注意这里
			}
			var obj=outerFun();
			obj();  //结果为1
			obj();  //结果为2
			var obj2=outerFun();
			obj2();  //结果为1
			obj2();  //结果为2

 

什么是闭包:

内部函数 在定义它的作用域外部 被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被 释放,因为闭包需要它们.

 

 

--------------------------------------------------------------------------------------------------------

 

再来看一个例子

	function outerFun()
			{
				var a =0;
				alert(a);		
			}
			var a=4;
			outerFun();
			alert(a);

 结果是 0,4 .  因为在函数内部使用了var关键字 维护a的作用域在outFun()内部.

 

再看下面的代码:

			function outerFun()
			{
				//没有var 
				a =0;
				alert(a);		
			}
			var a=4;
			outerFun();
			alert(a);

 结果为 0,0 真是奇怪,为什么呢?

 

作用域链是描述一种路径的术语,沿着该路径可以确定变量的值 .当执行a=0时,因为没有使用var关键字,因此赋值操作会沿着作用域链到var a=4;  并改变其值.

 

 

   发表时间:2009-03-16  
最后一个例子还是不太明白,var声明不是被提前了么?
1 请登录后投票
   发表时间:2009-03-16  
作用域链是描述一种路径的术语,沿着该路径可以确定变量的值 .当执行a=0时,因为没有使用var关键字,因此赋值操作会沿着作用域链到var a=4;  并改变其值.

能不能具体清楚地解释一下,这个作用域链的具体链接,各个节点都是什么?
1 请登录后投票
   发表时间:2009-03-16  
Army 写道
最后一个例子还是不太明白,var声明不是被提前了么?


稍微修改一下最后一个例子的代码你就明白了:
function outerFun()  
{  
     alert(a);     // got 4
     a =0;  
     alert(a);     // got 0    
 }  
 var a=4;  
outerFun();  
alert(a);  

2 请登录后投票
   发表时间:2009-03-17  
Army 写道
最后一个例子还是不太明白,var声明不是被提前了么?


需要理解一下 JS 的执行...
很多人认为JS是逐行执行的,这个观点是不对的.
JS是逐块执行的...
2 请登录后投票
   发表时间:2009-03-17  
cocococoon 写道
Army 写道
最后一个例子还是不太明白,var声明不是被提前了么?


稍微修改一下最后一个例子的代码你就明白了:
function outerFun()  
{  
     alert(a);     // got 4
     a =0;  
     alert(a);     // got 0    
 }  
 var a=4;  
outerFun();  
alert(a);  




a就声明了一次而已。

这个啥也不能说明
1 请登录后投票
   发表时间:2009-03-17  
kimmking 写道
cocococoon 写道
Army 写道
最后一个例子还是不太明白,var声明不是被提前了么?


稍微修改一下最后一个例子的代码你就明白了:
function outerFun()  
{  
     alert(a);     // got 4
     a =0;  
     alert(a);     // got 0    
 }  
 var a=4;  
outerFun();  
alert(a);  




a就声明了一次而已。

这个啥也不能说明

你如果把函数function看成一个内部类就比较容易理解了
0 请登录后投票
   发表时间:2009-03-18  
从最后的例子看

outerFun可以引入外部的变量,而函数块内部的变量如果与外部同名而且用var重定义了,说明是函数的内部变量,否则引入的则是outerFun所在作用预的同名变量.
0 请登录后投票
   发表时间:2009-03-19  
elf8848 写道
		function outerFun()
			{
				var a=0;
				function innerFun()
				{
					a++;
					alert(a);
				}				
			}
			innerFun()

 上面的代码是错错误的.innerFun()的作用域在outerFun()内部,所在outerFun()外部调用它是错误的.

 

 

innerFun()前面加个outerFun();看看。

0 请登录后投票
   发表时间:2009-03-20  
没有用var 声明的局部变量,都视为全局变量
function test(){
          i = 10;//全局变量
}
var i = 0;
test();
alert(i);//out: 10
上面这个函数就是闭包了。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics