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()myNamespacemyNamespace.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として宣言する場合はvar、それを使用するステートメントの前に置く必要があります。var getSelText = ...ステートメントを関数の最初のステートメントにするだけrunです。


補足情報:

varJavascriptのステートメントは、宣言されている関数の先頭に「持ち上げられ」ているため、次のようになります。

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

本当にこれを意味します:

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

Javascriptのもう1つの同様の構成は、関数式ではなく、関数ステートメントです。

function() {
    var fn1 = function() { return fn2(); }; // Function expression
    alert(fn1());

    // Function statement
    function fn2() {
        return "Hello from fn2";
    }
}

上記のコードを実行すると、「Hellofromfn2」というアラートが正常に表示されます。これは、関数ステートメントが宣言されているスコープ内の他のステートメントの前にチップトップに引き上げられるためです。ご覧のとおり、これは非常に混乱する可能性があります。おそらく、従うべき最良の規則は、関数式を使用し、必要な順序でそれらを宣言することです。

于 2012-03-24T17:16:50.953 に答える