闭包与命名空间的相关性和用法

时间:2014-11-21 20:00:13

标签: javascript namespaces closures

关于闭包的this question中的答案表明闭包的重要性是"因为javascript没有像命名空间这样的功能,并且你可以很容易地搞乱所有类型的全局对象。 #34; msn guide将其描述为"词汇范围。"

并且this question非常清楚地描述了命名空间和闭包之间的区别......

所以我想知道,如果Javascript实际上确实有我常用的命名空间,那么现在关闭的用途是什么?当我可以通过名称空间组织和使用它时,我根本不会看到需要用闭包词法作用域来关闭变量。

1 个答案:

答案 0 :(得分:1)

JavaScript没有传统意义上的命名空间。这只是一个术语,用于描述在对象结构中组织库的功能。

闭包非常有用,因为库通常希望将状态存储在变量中,而无需将这些变量公开给任何其他代码。

如果该数据在命名空间对象上公开,那么该库的用户将更难以确定哪些属性被设计为与之交互,哪些属性仅供内部使用。

考虑例如:

var example_namespace = (function() {

  var interval;
  var element;

  function start() {
    if (interval) {
      return;
    }

    if (!element) {
      element = document.querySelector('span');
    }

    interval = setInterval(increment, 500);
  }

  function stop() {
    clearInterval(interval);
    interval = null;
  }

  function increment() {
    element.innerHTML++;
  }

  return {
    counter: {
      start: start,
      stop: stop
    }
  };
}());

addEventListener('load', function() {
  document.querySelector('#start').addEventListener('click', example_namespace.counter.start);
  document.querySelector('#stop').addEventListener('click', example_namespace.counter.stop);
});
Count:
<span>0</span>

<button type="button" id="start">start</button>
<button type="button" id="stop">stop</button>

不使用闭包,intervalelementincrement都会在命名空间对象或全局变量上公开。