`

Javascript 的函数式对象(二)从垃圾回收器的角度理解闭包

阅读更多

 

当一个javascript函数返回时,js解析器会保留它作用域内的所有变量和函数。

 

闭包(Closure)这个词形象地描述了函数作用域现场被“封闭包存”起来这一行为。

 

直到该函数不再被其他对象引用,其作用域内的变量和函数才能被释放回收。 

 

下面是关于js闭包的一段代码:

 

 

function outerFunc(){

    var privateAttr = 10;

    function innerFunc(){
        privateAttr *= 2;
        return privateAttr; 
    }
 
    return innerFunc;
}

// 通过调用outerFunc函数,返回一个指向innerFunc函数的引用,
// 这个引用被赋给变量refInnerFunc
var refInnerFunc = outerFunc();

// 通过 refInnerFunc 这个引用调用到 innerFunc 函数
refInnerFunc(); // return 20 变量privateAttr可被innerFunc访问并修改
refInnerFunc(); // return 40

// 调用outerFunc函数,创建了一个新的innerFunc函数的副本
var refInnerFunc2 = outerFunc();
refInnerFunc2(); // return 20 不同副本中变量privateAttr的值是独立的。
 

 

 

按照java回收机制的解释,方法内的局部变量在该方法被执行完毕后,

 

如果不再被其他对象引用,垃圾回收器可自行选择适当的时机回收这些局部变量。

 

但js的垃圾回收机制和java不同,上述js代码的执行结果便可以证明这一点。

 

js的垃圾回收机制同样是对不再被其他对象引用的变量或方法进行回收,

 

但因为js的引用不仅可指向变量,也可指向函数,在上述js代码中,

 

只要指向函数 innerFunc 的引用 refInnerFunc 还没有被设为null,

 

那么处在函数 innerFunc 作用域内的局部变量都不会被js垃圾回收器回收。

 

局部变量 privateAttr 被认为处在一个安全且相对封闭的“闭包”环境中,

 

访问它的唯一方法是通过调用处在同一作用域下的 innerFunc 函数来进行。

 

 

直到 innerFunc 函数不再被其他对象引用,其作用域内的变量和函数才能被释放回收。 


3
0
分享到:
评论
3 楼 hbc8848 2011-05-25  
sdcyst 写道
最后一行代码写错了,瑕不掩瑜

谢谢sdcyst的提醒,已经把最后一行代码的笔误改了: refInnerFunc2();
2 楼 sdcyst 2011-05-25  
最后一行代码写错了,瑕不掩瑜
1 楼 bigbighead 2010-11-18  
先顶,后看,哈哈

相关推荐

    JavaScript函数式编程

    JavaScript 是近年来非常受瞩目的一门编程语言,它既支持面向对象编程,也支持函数式编程。本书专门介绍JavaScript函数式编程的特性。 全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、...

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

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

    JavaScript闭包函数

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

    深入理解javascript原型和闭包

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

    javaScript函数式编程

    全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的编程、类编程。除此之外,附录中还介绍了更多...

    理解javascript函数式编程中的闭包(closure)_.docx

    理解javascript函数式编程中的闭包(closure)_.docx

    理解_JavaScript_闭包

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

    深度探讨javascript函数的原型链和闭包

    深度探讨javascript函数的原型链和闭包

    JavaScript核心(对象、原型、继承、上下文、闭包、this).pdf

    面向对象概念(对象封装,各种继承,闭包原理,this作用域等)介绍清晰易懂

    深入理解JavaScript系列

    深入理解JavaScript系列(16):闭包(Closures) 深入理解JavaScript系列(17):面向对象编程之一般理论 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现 深入理解JavaScript系列(19):求值策略...

    理解javascript函数式编程中的闭包(closure)

    主要帮助大家理解javascript函数式编程中的闭包(closure)概念,通俗地讲, JavaScript 中每个的函数都是一个闭包,感兴趣的小伙伴们可以参考一下

    JavaScript闭包

    Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C++的程序员来说是一个新的语言特性。本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ...

    深入理解_JavaScript_闭包

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

    JS匿名函数、闭包

    匿名函数,也称为拉姆达函数,是一种使用JavaScript函数的强大方式。以下总结了匿名函数的特点: 任何函数表达式从技术上说都是匿名函数,因为没有引用它们的确定的方式; 在无法确定如何引用函数的情况下,递归...

    js闭包函数

    学习javascript闭包函数的实用文档,讲解全面、详细。pdf格式,

    javascript 闭包

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

    深入理解javascript原型和闭包.pdf

    javascript原型和闭包

    深入理解javascript函数参数与闭包

    最近在学习javascript的函数,函数是javascript的一等对象,想要学好javascript,就必须深刻理解函数。本人把学习的过程整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径,避免走弯路。内容有些多...

    尚硅谷——JavaScript闭包

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

Global site tag (gtag.js) - Google Analytics