`

javascript中的闭包

阅读更多
了解闭包前,需要对JavaScript的变量作用域有一定的了解,请参考文章:
http://www.cnblogs.com/rainman/archive/2009/04/28/1445687.html#1865103
http://blog.csdn.net/hzrui/archive/2009/02/27/3941137.aspx
一、闭包的定义
官方定义:
引用
闭包是可以包含自由(未绑定)变量的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。

上面提到的“代码块”,在实际应用中通常会是一个函数。
下面看一个简单的例子1:
var message = "hello world";
function sayHelloWorld(){
    alert(message);
}
sayHelloWorld();//运行结果为:"hello world"

例1中, message并未在函数sayHelloWorld中定义,而在其外部定义,即在闭包官方定义中的“定义代码块中的环境”定义。
常用的形式是在一个函数中定义另一个函数,例2:
var count=10;
var f1 = function(num1,num2){
    function f2(){
      return count+num1+num2;
      }
    return f2();
};
alert(f1(1,2));//运行结果为:13

例2中,f2作为f1的内部函数,并未接受参数,函数执行是需要的值是从执行环境中获取的。f2无疑是闭包
二、闭包的作用
1.在函数外部访问函数的局部变量。例3;
function f1(){
 var i=100;
 function f2(){
   return ++i;
 }
 return f2;
}
var result =f1();
alert(result());//结果为101

在例3中利用闭包在函数f1外部访问了,局部变量i的值。注意:如果定义变量时不加var关键字,则此变量为全局变量,全部变量均为window对象的属性
2.在内存中维持变量。
将例3稍作修改,例4:
function f1(){
 var i=100;
 rel = function(){i+=1};
 function f2(){
   return ++i;
 }
 return f2;
}
var result =f1();
alert(result());//结果101
rel();
alert(result())//结果103

例4中,f1的局部变量i在第一次调用f1后并未被回收,而是一直驻留内存,这是由于f2被赋给了全局变量result,而f2依赖于f1,所以在使用时f1和f2都是驻留在内存中的
三、总结
javascript的很多高级应用都要用到闭包,但是使用闭包时要格外小心,不恰当的使用会导致内存泄露,在设计时要保证退出函数时销毁全部不再使用的局部变量。
参考资料:http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
分享到:
评论

相关推荐

    JavaScript中闭包之浅析解读(必看篇)_.docx

    JavaScript中闭包之浅析解读(必看篇)_.docx

    JavaScript中闭包之浅析解读(必看篇)

    下面小编就为大家带来一篇JavaScript中闭包之浅析解读(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    javascript中闭包概念与用法深入理解

    本文实例分析了javascript中闭包概念与用法。分享给大家供大家参考,具体如下: 1.问题的引出,什么时候会遇到闭包? 首先因为JS是没有块状作用域的,但是有函数作用域即函数作为了局部变量之间的界限,不同函数内的...

    JavaScript中闭包的详解

    本文主要介绍了JavaScript中闭包的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧

    理解_JavaScript_闭包

    本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。

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

    js闭包 • 每个函数都有一个包含词法环境的执行上下文,它的词法环境确定了函数内的变量赋值以及对外部环境的引用。...• JavaScript中闭包作用域是词法作用域,即它在代码写好之后就被静态决定了它的作用域。

    尚硅谷——JavaScript闭包

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

    JavaScript闭包函数

    闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...

    JavaScript中闭包的写法和作用详解

    1、什么是闭包 闭包是有权访问另一个函数作用域的变量的函数。 简单的说,Javascript允许使用内部函数—即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的...

    JavaScript闭包

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

    javascript闭包详解中文word版

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

    javascript中闭包(Closure)详解

    闭包(closure)是Javascript语言的一个...小编之前一直糊里糊涂的,没有能够弄明白JavaScript的闭包到底是什么,有什么用,本文把自己的理解些出来分享一下,希望不理解JavaScript闭包的朋友们看了之后能够理解闭包!

    JavaScript对闭包的理解.md

    为了帮助大家快速和较好地理解JavaScript函数中的闭包,本文对JavaScript的闭包进行了分析并进行简易的代码演示,希望本文能够给有需要的人带来一点小小的帮助。

    javascript 闭包

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

    深入理解javascript原型和闭包

    深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系

    深入理解_JavaScript_闭包

    理解 JavaScript 闭包 要成为高级 JavaScript 程序员,就必须理解闭包

    Javascript 闭包完整解释

    Javascript 闭包完整解释

Global site tag (gtag.js) - Google Analytics