`

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闭包可被利用的常见场景

    JavaScript 闭包是一种强大的编程工具,常常被用来解决特定的问题和优化代码结构。在JavaScript中,闭包是指一个函数能够访问并操作其定义时的作用域内的变量,即使该函数在其外部作用域被调用。以下将详细介绍两个...

    js闭包个人理解

    ### JavaScript闭包的理解 在JavaScript中,闭包(Closure)是一种非常重要的概念,它涉及到函数作用域、变量生命周期以及函数内部对外部作用域的访问等多个方面。本文将基于提供的文件内容,深入探讨JavaScript...

    Javascript 闭包完整解释

    ### JavaScript闭包完整解释 #### 一、闭包的基本概念 **闭包**是一个非常重要的JavaScript概念,它指的是一个函数能够记住并访问其外部作用域中的变量的能力,即使该函数在其外部作用域之外被调用也是如此。具体...

    js闭包详细讲解

    ### JavaScript闭包详解 #### 一、闭包概念与特性 **闭包**是JavaScript语言的一个重要特性,它使得函数可以访问并操作其外部作用域内的变量,即使该函数在其外部作用域之外被调用。要理解闭包,首先需要了解...

    js闭包理解之倒计时

    在这个“js闭包理解之倒计时”的主题中,我们将深入探讨如何利用闭包实现一个实际项目中的倒计时功能。 首先,让我们了解一下闭包的基本概念。在JavaScript中,每当函数被创建时,它都会形成一个闭包,这个闭包包含...

    js闭包写法学习demo

    以下是一些关于JavaScript闭包的关键知识点: 1. **函数嵌套**:闭包最常见的形式是内部函数引用了外部函数的变量。例如: ```javascript function outerFunction() { var outerVar = 'I am from the outer ...

    JavaScript闭包

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

    JavaScript闭包研究及典型应用.pdf

    JavaScript 闭包研究及典型应用 JavaScript 闭包是一种强大的技术,能够在各种场景中发挥重要作用。本文将介绍 JavaScript 闭包的定义、使用场景和典型应用。 闭包函数的定义和使用场景 在 JavaScript 语言中,...

    javascript 闭包

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

    JS 闭包的理解

    总之,JavaScript闭包是理解和编写高效、模块化代码的关键概念,它能帮助我们更好地管理作用域、变量和内存,从而提高代码的复用性和可维护性。在日常开发中,熟练掌握闭包不仅可以提升编程技能,也能让代码更加优雅...

    基于JavaScript闭包的Web图片浏览控件的实现.pdf

    基于JavaScript闭包的Web图片浏览控件的实现 本文主要讲解了基于JavaScript闭包原理的Web图片浏览控件的实现,包括JavaScript闭包概念、闭包应用场景、Web图片浏览控件的设计思路和实现方法。 1. JavaScript闭包...

    javascript闭包详解中文word版

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

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

    闭包是JavaScript中实现数据隐藏和封装的一种重要手段,对于理解和编写高效的JS代码至关重要。 1. **作用域的理解** - **全局变量**:在整个程序中都可访问的变量,它们在整个脚本的生命周期内都存在。 - **局部...

    js闭包学习

    JavaScript中的闭包是一种强大的特性,它允许函数访问和操作其外部作用域内的变量,即使在外部函数执行完毕后,闭包依然能保持对外部变量的访问。闭包的关键在于,它能够保留函数内部状态,使得数据得以持久化,这...

    javascript闭包的理解

    标题《JavaScript闭包的理解》涉及的知识点主要围绕JavaScript编程中的一个重要概念——闭包。闭包是一个高级且复杂的话题,它是JavaScript语言的核心特性之一,同时也是一大难点。要想熟练运用JavaScript,掌握闭包...

    layer.rar 使用js 闭包封装的原生提示模态框

    在这个场景中,我们讨论的是一个名为"layer.rar"的压缩包,它包含了一个利用JavaScript闭包技术封装的提示模态框。这个模态框设计得既适应PC设备,也能在不同分辨率的设备上良好运行,体现了响应式设计的概念。 ...

    JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解

    在深入讨论JavaScript闭包之前,首先需要了解JavaScript的变量作用域。在JavaScript中,变量的作用域分为两种:全局变量和局部变量。全局变量是在函数外部定义的变量,可以在JavaScript程序的任何地方被访问。局部...

    javascript 闭包实例下载

    JavaScript 闭包是一种高级编程概念,它在JavaScript中扮演着至关重要的角色,特别是在函数式编程和模块化设计中。闭包本质上是函数和其能够访问...通过学习这些实例,你将能够更好地掌握JavaScript闭包这一核心概念。

    [深入理解JS闭包]帮助你快速学习js的闭包,简单高效的文档资源

    JavaScript 闭包是一种强大的特性,它允许函数访问和操作其外部作用域的变量,即使在其外部函数执行完毕后,闭包依然能保持对外部变量的访问。闭包的关键在于内部函数能够记住它被创建时的环境,即它可以访问定义在...

    什么是js闭包

    ### 什么是JS闭包 #### 一、变量的作用域与闭包的基础 在JavaScript中,理解闭包之前,首先需要掌握变量的作用域概念。变量的作用域主要分为两种:全局变量和局部变量。全局变量在整个程序范围内都可以访问,而...

Global site tag (gtag.js) - Google Analytics