首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >闭包与命名空间的相关性和用途

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

Stack Overflow用户
提问于 2014-11-21 20:00:12
回答 1查看 56关注 0票数 0

在闭包的这个问题中,答案是,闭包的重要性是“因为javascript没有像名称空间那样的特性,而且您可以很容易地处理所有类型的全局对象。”msn导轨将其描述为“词法范围界定”。

这个问题非常清楚地描述了名称空间和闭包之间的区别。

所以我想知道,如果Javascript真的有名称空间(我通常使用的名称空间),那么现在闭包有什么用呢?当我可以通过名称空间组织和使用变量时,我只是不认为有必要关闭带有闭包词法作用域的变量。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-21 20:20:29

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);
});
代码语言:javascript
复制
Count:
<span>0</span>

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

如果不使用闭包,intervalelementincrement都将在命名空间对象或全局上公开。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27069332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档