OOP,名称空间的顶级方法内的私有函数

时间:2012-03-24 17:13:29

标签: javascript oop private-members javascript-namespaces

我有一个声明命名空间的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();
        }
    }
}

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

当我运行此脚本时,收到错误:

  

getSelText不是函数。

我对JavaScript很陌生,所以我不知道设计它的最佳方法。是否有可能实现我的目标?我是以错误的方式解决这个问题吗?

感谢任何帮助!

2 个答案:

答案 0 :(得分:7)

它被称为模块模式。创建一个匿名函数(用于作用域),立即调用并返回公共接口。

var myNamespace = (function() {
  // private functions for your namespace
  var getSelText = function() {
        ...
  };

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

答案 1 :(得分:4)

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


补充信息:

Javascript中的

var语句被“提升”到它们声明的函数的顶部,所以这个:

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";
    }
}

如果您运行上面的代码,它将成功提示“来自fn2的Hello”。这是因为函数语句在声明范围内的任何其他语句之前被提升到tip-top。正如您所看到的,这可能会非常混乱。可能遵循的最佳约定是使用函数表达式并按照您需要的顺序声明它们。