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

简介:

function outerFunc(){

    var privateAttr = 10;

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

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

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

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

 

 

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

 

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


本文转自艾伦 Aaron博客园博客,原文链接:http://www.cnblogs.com/aaronjs/archive/2011/10/28/2228194.html,如需转载请自行联系原作者

 

相关文章
|
9天前
|
JavaScript 前端开发
JavaScript遍历数组和对象常用方法总结
以上代码展示了数组和对象的多种遍历方法。对于数组,使用了传统的 `for` 循环、`for...in` 和 ES6 的 `for...of` 进行遍历;对于对象,则通过 `for...in`、`Object.keys()`、`Object.values()` 和 `Object.entries()` 来获取键值对。`for...of` 循环适用于遍历具有迭代协议的数据结构,如数组、字符串等,而对象遍历则更多地依赖于 `Object` 方法来获取其属性集合。
JavaScript遍历数组和对象常用方法总结
|
4天前
|
JavaScript 前端开发 Java
JavaScript基础知识-垃圾回收
关于JavaScript垃圾回收基础知识的介绍。
13 1
JavaScript基础知识-垃圾回收
|
4天前
|
JavaScript 前端开发
JavaScript基础知识-枚举对象中的属性
关于JavaScript基础知识中如何枚举对象属性的介绍。
11 1
JavaScript基础知识-枚举对象中的属性
|
5天前
|
JavaScript 前端开发
JavaScript基础知识-对象的基本操作
关于JavaScript对象基本操作的基础知识文章。
14 2
|
4天前
|
JavaScript 前端开发
JavaScript基础知识-对象字面量
文章介绍了JavaScript中对象字面量的创建和使用,包括基本语法、属性赋值以及如何在控制台输出对象属性。
11 0
JavaScript基础知识-对象字面量
|
6天前
|
JavaScript 前端开发 API
Javaweb之javascript的BOM对象的详细解析
BOM为Web开发提供了强大的API,允许开发者与浏览器进行深入的交互。合理使用BOM中的对象和方法,可以极大地增强Web应用的功能性和用户体验。需要注意的是,BOM的某些特征可能会在不同浏览器中表现不一致,因此在开发过程中需要进行仔细的测试和兼容性处理。通过掌握BOM,开发者能够制作出更丰富、更动态、更交互性的JavaWeb应用。
9 1
|
15天前
|
前端开发 JavaScript Java
揭开 JavaScript 垃圾回收的秘密——一场与内存泄漏的生死较量,让你的代码从此焕然一新!
【8月更文挑战第23天】本文通过多个实例深入探讨了JavaScript中的垃圾回收机制及其对应用性能的影响。首先介绍了基本的内存管理方式,随后分析了变量不再使用时的回收过程。接着,通过事件监听器未被移除及全局变量管理不当等场景展示了常见的内存泄漏问题。最后,文章介绍了使用`WeakRef`和`FinalizationRegistry`等现代API来有效避免内存泄漏的方法。理解并运用这些技术能显著提升Web应用的稳定性和效率。
33 0
|
7天前
|
自然语言处理 JavaScript 前端开发
|
15天前
|
自然语言处理 前端开发 JavaScript
前端进阶必读:JS闭包深度解析,掌握这一特性,你的代码将焕然一新!
【8月更文挑战第23天】闭包是JavaScript的一项高级功能,让函数能够访问和操作外部函数作用域中的变量。本文深入解析闭包概念、组成及应用场景。闭包由函数及其词法环境构成,通过在一个函数内定义另一个函数来创建。它有助于封装私有变量、维持状态和动态生成函数。然而,不当使用闭包可能导致内存泄漏或性能问题。掌握闭包对于实现模块化代码和成为优秀前端开发者至关重要。
27 0
|
17天前
|
存储 JavaScript 前端开发
一文带你深度解析:JavaScript中对象与数组的威力究竟有多大?
一文带你深度解析:JavaScript中对象与数组的威力究竟有多大?