JS模块模式 - 为什么不删除私有变量

时间:2014-06-14 05:24:16

标签: javascript oop module

我正在学习Javascript的模块模式。以下是“篮子”模块的示例。

我想我明白这是一个执行的匿名函数,所以你不能只访问它返回的变量。为什么在匿名函数完成执行后,此函数中的变量和函数未被删除/垃圾收集? 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;
    }
  };
})();

2 个答案:

答案 0 :(得分:1)

只要有对象的引用,就不会进行垃圾回收。

在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.

此处有更长时间的讨论:
How do JavaScript closures work?

答案 1 :(得分:0)

您指的是闭包范围。 封闭范围是内部函数可以访问的范围,即使在创建范围的外部函数返回后

所以,是的,你是对的,外部的'private'函数不会被垃圾收集直到有权访问它的内部作用域不再存在于内存中