【问题标题】:OOP, private functions inside a top level method of the namespaceOOP,命名空间顶级方法内的私有函数
【发布时间】:2012-04-08 20:54:27
【问题描述】:

我有一个声明命名空间的 js 脚本,然后有一个名为 run() 的方法,我可以从像 myNamespace.run() 这样的 XUL 脚本内部调用它:

var myNamespace = {
    run: function() {
        var selectedText = getSelText();
        alert (selectedText);

        var getSelText = function() {
            var focusedWindow = document.commandDispatcher.focusedWindow;
            var selText = focusedWindow.getSelection();

            return selText.toString();
        }
    }
}

我希望能够在myNamespace.run() 中调用getSelText(),而无需将getSelText() 声明为myNamespace 的另一个顶级函数。相反,它应该像 myNamespace.run() 中的私有方法。

当我运行这个脚本时,我收到一个错误:

getSelText 不是函数。

我对 JavaScript 很陌生,所以我不知道设计它的最佳方式。是否有可能实现我正在尝试的目标?我是不是走错了路?

感谢任何帮助!

【问题讨论】:

    标签: javascript oop private-members javascript-namespaces


    【解决方案1】:

    它被称为模块模式。创建一个立即调用并返回公共接口的匿名函数(用于范围界定)。

    var myNamespace = (function() {
      // private functions for your namespace
      var getSelText = function() {
            ...
      };
    
      return {
        run: function() {
            var selectedText = getSelText();
            alert (selectedText);
        }
      };
    })()
    

    【讨论】:

      【解决方案2】:

      如果您将getSelText 声明为var,则它需要出现在您使用它的任何语句之前。只需将var getSelText = ... 语句设为run 函数中的第一条语句即可。


      补充信息:

      var Javascript 中的语句被“提升”到声明它们的函数的顶部,因此:

      function() {
          var a = 42;
          // Other stuff...
          var b = 23; 
      }
      

      真的是这个意思:

      function() {
          var a = 42, b;
          // Other stuff...
          b = 23;
      }
      

      Javascript 中另一个类似的结构是函数语句,而不是函数表达式:

      function() {
          var fn1 = function() { return fn2(); }; // Function expression
          alert(fn1());
      
          // Function statement
          function fn2() {
              return "Hello from fn2";
          }
      }
      

      如果您运行上面的代码,它会成功提醒“Hello from fn2”。这是因为函数语句在声明它们的范围内的任何其他语句之前被提升到顶端。如您所见,这可能会变得非常混乱。最好遵循的约定可能是使用函数表达式并按照您需要的顺序声明它们。

      【讨论】:

      • 感谢您的信息!还发现我可以在没有 var 语句的情况下声明函数并在 run() 中调用它们
      • 一个小问题,变量被提升到顶部,但初始化不是。如果“其他东西”访问它,b 在您的示例中是 undefined。然后设置为23。没错,如果在创建之前使用函数语句(在范围内),函数语句将起作用。
      • 谢谢!我修正了我的答案。
      猜你喜欢
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 2019-07-13
      • 2016-03-16
      相关资源
      最近更新 更多