【问题标题】:relevance and use for closures vs namespacing闭包与命名空间的相关性和使用
【发布时间】:2015-01-20 01:40:01
【问题描述】:

this question 中关于闭包的答案表明闭包的重要性是“因为 javascript 没有命名空间之类的功能,您可以很容易地与各种全局对象混淆。” msn guide 将其描述为“词法作用域”。

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

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

【问题讨论】:

    标签: javascript namespaces closures


    【解决方案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 将全部暴露在命名空间对象或全局变量上。

    【讨论】:

    • 抱歉,在您的示例中,我没有看到在命名空间对象上公开 intervalelementincrement 的问题。
    • 暴露它们只会让破解更容易,更难理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2012-10-14
    • 1970-01-01
    • 2019-06-20
    相关资源
    最近更新 更多