`

JS 闭包

阅读更多
		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;  并改变其值.

 

 

分享到:
评论
44 楼 shuaijie506 2009-09-18  
闭包的这个还是第一次听说,长见识了。
作用域那个早就知道,还是自己试出来的,现在每用一个变量我都要var 定义,要不就会改变其它的值了。(for循环里的i最为明显,不明白的人可以写一个循环,在循环里调用另一个方法,在这个方法也也使用循环,循环变量都用i,你就会见到一个神奇的结果)
43 楼 johnicesea 2009-09-17  
hanjs 写道
从最后的例子看

outerFun可以引入外部的变量,而函数块内部的变量如果与外部同名而且用var重定义了,说明是函数的内部变量,否则引入的则是outerFun所在作用预的同名变量.

这样的话我就明白了
42 楼 hlislichking 2009-09-12  
cocococoon 写道
Army 写道
最后一个例子还是不太明白,var声明不是被提前了么?


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



还用一个例子你可能就更能理解了
function outerFun()  
{  
     alert(a);     // got 4
     a =0;  
     alert(a);     // got 0    
 }
outerFun();  //函数位于var定义变量之前
var a=4;  
alert(a);  

这样的话就会报错,因为执行函数时,才会根据作用域需找定义的变量,此时的变量a还未定义
41 楼 koalaxyq 2009-09-01  
Jamson 写道

<script>
function outerFun()  
{  
    var b=0;  
    function innerFun()  
    {  
        a=1;  
        alert(a);  
    }  
    return innerFun;  //注意这里  
}  
var obj=outerFun();  
obj();  //结果为1  
obj();  //结果为2  
alert(outerFun.b);  //结果为undefined
alert(obj.b);     //结果为undefined
</script>

有人能为我解释一下:最后两个为什么是undefined嘛?


Jamson 写道

obj();  //结果为1  
obj();  //结果为2


结果都应为1

Jamson 写道
<
alert(outerFun.b);  //结果为undefined
alert(obj.b);     //结果为undefined


因为outerFun是函数,obj是对函数的引用,b是函数内部的局部变量
不能像对象引用属性那样来引用它,也不可能
因而outerFun.b与obj.b都是undefined的
40 楼 Jamson 2009-08-19  
<script>
function outerFun()  
{  
    var b=0;  
    function innerFun()  
    {  
        a=1;  
        alert(a);  
    }  
    return innerFun;  //注意这里  
}  
var obj=outerFun();  
obj();  //结果为1  
obj();  //结果为2  
alert(outerFun.b);  //结果为undefined
alert(obj.b);     //结果为undefined
</script>

有人能为我解释一下:最后两个为什么是undefined嘛?
39 楼 geke260 2009-04-27  
http://www.iteye.com/wiki/Object_Oriented_JavaScript/1317-javascript-object-oriented-technology-6
这里讲的比较详细。。。
38 楼 peanut_sei 2009-04-23  
shinelgz 写道
没有用var 声明的局部变量,都视为全局变量
function test(){
          i = 10;//全局变量
}
var i = 0;
test();
alert(i);//out: 10
上面这个函数就是闭包了。


同意。
37 楼 jsnjlc 2009-04-22  
民工精髓 写道
cocococoon 写道
Army 写道
最后一个例子还是不太明白,var声明不是被提前了么?


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



改成这样也许更容易理解,函数的声明在前在后没有关系,只跟调用有关
var a=4;    
outerFun();    
alert(a); 
function outerFun()    
{    
    alert(a);     // got 4  
    a =0;    
    alert(a);     // got 0      
}

改完后outerFun还没有声明呢,是undefined,js是一块块的按顺序解释执行。
36 楼 diipo_xiao 2009-04-21  
感觉就是还是按照行执行代码,只不过遇到函数的时候就继续,遇到没有var定义的变量,则联系上下文查找var。说明对var的处理优先级很高。
35 楼 我的马甲 2009-04-20  
终于可以发贴了..
34 楼 orcl_zhang 2009-04-14  
javaeys上有一篇关于js的面向对象的讲解,还有《悟透JavaScript》资料,结合起来看,看完后就会茅塞顿开。
33 楼 sniperking 2009-04-13  
学习了,有了一个大概的了解,这个和平常的程序里的闭包概念差不多
32 楼 alex09 2009-04-12  
histan 写道
可以给详细相关资料吗?

知识库中的javascript面向对象技术基础有六讲,非常不错,可以去看下的
31 楼 histan 2009-04-10  
可以给详细相关资料吗?
30 楼 aninfeel 2009-04-05  
定义时和运行时分开,就好懂了。
29 楼 bsq519 2009-04-01  
至于最后一个问题。其实就是一个变量作用域的问题。有全局变量,和局部变量。
28 楼 yangtse_ye 2009-03-31  
最后一个例子无关闭包这个概念吧
只是跟代码的解析/执行顺序,以及变量的作用域有关
看一下犀角书,理解起来不难的应该
27 楼 chris_zley 2009-03-25  
看明白了,就是个变量作用域的关系

最后那个a开始是赋值为4了,后来进入outerFun,赋值为0就改变了全局作用域的a,所以下面也是0

但下面两个例子和前两个例子有什么关系呢。。闭包一般用在什么场合?
26 楼 kimmking 2009-03-25  
1、JavaScript按块来解释执行
2、同一块中,function前后顺序没有关系
3、全局变量的问题,请看hax大神blog的有奖问答帖~~
25 楼 丁丁豆 2009-03-25  
这不就是一个全局变量和局部变量的问题吗,在实际中应用的不多,所以自我感觉没有必要掌握,只应学习拓展

相关推荐

    JS闭包可被利用的常见场景

    JS闭包可被利用的常见场景。值得保留的文档。值得一看

    Javascript 闭包完整解释

    Javascript 闭包完整解释

    js闭包详细讲解

    js闭包的详细讲解

    js闭包个人理解

    js闭包的个人理解

    JavaScript闭包

    Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态...本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAScript语言规范来使读者可以更深入的理解闭包。

    js闭包写法学习demo

    js闭包写法学习demo

    js闭包理解之倒计时

    网上大多只是讲解js闭包的大概意思和小例子,但真实用于项目中又该怎么用呢。这个例子真实的告诉大家在项目中的用法

    js闭包的理解以及作用.docx

    JS闭包理解 什么是闭包? 当有一个函数想要访问另一个函数内部的变量,这个是访问不了的。所有我们要用闭包来访问。所以简单的来说,闭包就是连接函数内部和外部的一座桥梁,通过闭包我们能够访问其他函数内部的...

    javascript 闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

    javascript闭包详解中文word版

    资源名称:javascript闭包详解 中文word版   内容简介: Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C 的程序员来说是一个新的...

    尚硅谷——JavaScript闭包

    JavaScript闭包 JavaScript闭包 JavaScript闭包 JavaScript闭包

    【JavaScript源代码】js闭包和垃圾回收机制示例详解.docx

    js闭包和垃圾回收机制示例详解  目录 前言 正文  1.闭包  1.1闭包是什么?  1.2闭包的特性 1.3理解闭包  1.4闭包的主要实现形式  1.5闭包的优缺点  1.6闭包的使用  2.垃圾回收机制 总结  前言  正文  ...

    JS闭包经典

    闭包一点即通 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

    js闭包学习

    javaScript无可争议的是如今前台开发最常用的技术,该文档讲解了javaScript中闭包技术,在jquery中大量的使用了该技术,学好可以更好的理解学习jquery。

    【JavaScript源代码】详解JavaScript闭包问题.docx

    详解JavaScript闭包问题  闭包是纯函数式编程语言的传统特性之一。通过将闭包视为核心语言构件的组成部分,JavaScript语言展示了其与函数式编程语言的紧密联系。由于能够简化复杂的操作,闭包在主流JavaScript库...

    javaScript闭包技术资料

    javaScript闭包技术资料

    js闭包的介绍

    js闭包的介绍

    javascript 闭包实例下载

    javascript 闭包实例下载

    javascript深入理解js闭包.docx

    javascript深入理解js闭包.docx

    JS中的闭包理解。。。。。。。。

    js闭包 • 每个函数都有一个包含词法环境的执行上下文,它的词法环境确定了函数内的变量赋值以及对外部环境的引用。看上去函数“记住”了外部环境,但其实上是这个函数有个指向外部环境的引用。这就是“闭包”的...

Global site tag (gtag.js) - Google Analytics