2012-03-24 12 views
4

名前空間のトップレベルのメソッド内でプライベート関数は、その後、私はmyNamespace.run()ようXULスクリプト内から呼び出すことができますrun()と呼ばれる方法がありますgetSelText()の中にmyNamespace.run()を呼び出すことができるようにするには、myNamespaceの別の最上位機能としてgetSelText()を宣言する必要はありません。代わりに、myNamespace.run()のプライベートメソッドのようにする必要があります。私はこのスクリプトを実行するとOOP、私は名前空間を宣言jsのスクリプトを持って

は、私はエラーが表示さ:

getSelText is not a function.

私はJavaScriptにかなり新しいですが、私はこれを設計する最善の方法を知りません。私がしようとしていることを達成することは可能ですか?私はこれについて間違った方法をとっていますか?

ありがとうございました!

答えて

4

getSelTextvarと宣言する場合は、使用するステートメントの前に来る必要があります。 run関数の最初のステートメントをvar getSelText = ...ステートメントにするだけです。


補足情報:

var彼らが宣言されている関数の先頭に "掲揚" されているJavaScriptでのステートメントので、この:

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

は本当にこのことを意味します

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

アント

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

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

あなたは上記のコードを実行した場合、それが成功した「FN2からこんにちは」を警告する:式を機能させるとは対照的に、ER JavaScriptで同様のコンストラクトは、functionステートメントです。これは、宣言されているスコープ内の他のステートメントの前に、関数ステートメントがヒントトップにぶら下がっているためです。わかりますが、これは非常に混乱する可能性があります。関数式を使用し、必要な順序で宣言することが、おそらく最良の方法です。

+1

ありがとうございました!また、私はvarステートメントを使わずに関数を宣言し、run()の中で呼び出すことができることを発見しました – bobbyrne01

+0

小さなニックピック、変数は上に吊り上げられますが、初期化はありません。 "他のもの"がそれにアクセスする場合、あなたの例では 'b'は' undefined'です。それから '23 'に設定されます。関数ステートメントが作成される前に使用されていれば機能します(範囲内)。 –

+0

ありがとう!私は答えを決めた。 – FishBasketGordo

7

これはモジュールパターンと呼ばれています。すぐに呼び出され、パブリックインターフェイスを返す匿名関数(スコープ用)を作成します。

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

    return { 
    run: function() { 
     var selectedText = getSelText(); 
     alert (selectedText); 
    } 
    }; 
})() 
関連する問題