JS模块模式-为什么私有变量不被删除
JS module pattern - why are private variables not deleted
我正在学习Javascript的模块模式。下面是一个"basket"模块的例子。
我想我明白这是一个匿名函数,所以你不能访问它的变量,只能访问它的返回值。为什么这个函数中的变量和函数在匿名函数完成执行后没有被删除/垃圾收集?JS如何知道将它们保存在内存中以供以后使用?是因为我们返回了一个可以访问它们的函数吗?
var basketModule = (function () {
// privates
var basket = [];
function doSomethingPrivate() {
//...
}
function doSomethingElsePrivate() {
//...
}
// Return an object exposed to the public
return {
// Add items to our basket
addItem: function( values ) {
basket.push(values);
},
// Get the count of items in the basket
getItemCount: function () {
return basket.length;
},
// Public alias to a private function
doSomething: doSomethingPrivate,
// Get the total value of items in the basket
getTotal: function () {
var q = this.getItemCount(),
p = 0;
while (q--) {
p += basket[q].price;
}
return p;
}
};
})();
只要存在对对象的引用,它就不会被垃圾收集。
在JavaScript术语中,上面的代码创建了一个Closure,有效地将外部值捕获在内部函数中。
下面是一个简短的闭包示例:
var test = (function() {
var k = {};
return function() {
// This `k` is trapped -- closed over -- from the outside function and will
// survive until we get rid of the function holding it.
alert(typeof k);
}
}());
test();
test = null;
// K is now freed to garbage collect, but no way to reach it to prove that it did.
更详细的讨论在这里:
JavaScript闭包是如何工作的?
您指的是闭包作用域。闭包作用域是内部函数可以访问的作用域,即使在创建该作用域的外部函数返回之后也是如此!
所以,是的,你是正确的,外部'private'函数将不会被垃圾收集,直到访问它的内部作用域不再在内存中。
相关文章:
- 如何使用jquery随机删除变量
- 改进js代码以删除全局变量和函数
- 用于添加和删除类的 Jquery 打开/关闭变量
- 删除两个函数使用的全局变量
- 从类函数中删除类变量
- Rails从本地环境变量中删除端口
- 从数组中删除元素,然后保留其状态以备将来使用,而不使用全局变量
- JSON删除还会删除源变量中的属性
- 在使用javascript再次声明变量之前,请先清除或删除该变量
- nodejs中的Javascript全局变量和属性-全局属性有时会被删除
- 如何删除或取消设置Javascript变量
- 从 json 代码中删除 javascript 对象变量名称文本
- 从数组中删除不会更新变量内的引用
- 如何在 PHP 中从以前的 URL 中删除 $_GET 变量
- 使用 javascript 从页面中删除变量或对象
- 如何从 JavaScript 变量中删除所有小数
- 如何在变量 Javascript 中删除双引号
- 删除主干中的变量
- 传单 - 根据变量添加和删除列表中的所有图层
- 操作后会话变量 删除