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

relevance and use for closures vs namespacing

本文关键字:用法 相关性 命名空间 闭包      更新时间:2023-09-26
这个

关于闭包的问题的答案指出了闭包的重要性是"因为javascript没有像命名空间这样的功能,而且你可以很容易地搞砸各种全局对象。MSN指南将其描述为"词汇范围"。

这个问题非常清楚地描绘了命名空间和闭包之间的区别......

所以我想知道,如果Javascript确实有我经常使用的命名空间,那么现在闭包有什么用?当我可以通过命名空间组织和使用变量时,我根本不认为有必要使用闭包词法范围关闭变量。

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 都将在命名空间对象或全局变量上公开。