4

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

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 很陌生,所以我不知道设计它的最佳方式。是否有可能实现我正在尝试的目标?我会以错误的方式解决这个问题吗?

感谢任何帮助!

4

2 回答 2

7

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

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

  return {
    run: function() {
        var selectedText = getSelText();
        alert (selectedText);
    }
  };
})()
于 2012-03-24T17:20:10.577 回答
4

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


补充资料:

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

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”。这是因为函数语句在声明它们的范围内的任何其他语句之前被提升到顶端。如您所见,这可能会变得非常混乱。最好遵循的约定可能是使用函数表达式并按照您需要的顺序声明它们。

于 2012-03-24T17:16:50.953 回答