2009-06-06 18 views
4

私はExtJSライブラリを含むプロジェクトに取り組んでいますが、私は理解できませんでした(しかし動作します)このコードを読んできました。助けてください:(。Javascript関数のパラメータ

TreePanel.on('click', showDocumentFromTree); 
function showDocumentFromTree(node) { 
    if (TreePanel.getSelectionModel().isSelected(node)) { 
     dataStore.baseParams = { 
      node : node.id, 
      limit : 10 
     } 
     dataStore.load({ 
      params : { 
       start : 0 
      } 
     }); 
    } 
}; 

だから、「showDocumentFromTree」のための関数定義は、「ノード」と呼ばれるパラメータを持っていますが、コードはそれを呼び出したときに、それは何も渡しませんでした。また、オブジェクト「ノード」ではありません(私の知る限りでは)グローバル。

だから私は?それがどのように機能するかについて混乱しているこれはJavascriptが持っている?

をまた、私は「ノード」を印刷するconsole.debugを行う際に、いくつかの魔法です(FireBugのためのconsole.debug)

ありがとう、 J

+1

この行は、 TreePanel.on( 'click'、showDocumentFromTree); 関数showDocumentFromTreeを呼び出します(私はここで推測しています)、間違っています。ある時点で呼び出される関数を登録するだけです。 – airportyh

+0

+1は、jQueryを支配する時代に見えるものでExtjを使うためのものです。 :) –

答えて

0

この場合、showDocumentFromTreeへのパラメータは、アクションがアタッチされている要素をユーザーがクリックしたときにブラウザによって提供されるマジックパラメータです。この場合、nodeTreePanelを参照します。 Javascript - The this keywordはこのメカニズムの詳細を説明しています。あなたの例のように、nodeよりもパラメータ名thisを使用する方が一般的です。

+3

私はこれが本当に正しいとは思わない。 「this」は形式的なパラメータではありません(「ノード」など)。関数の環境の一部です。この場合、extJSは内部でユーザー提供関数( "on"関数で渡された)を呼び出すクリックハンドラを登録し、これを渡します。例えば。 userProvidedFunction(this)。次に、「ノード」は「this」の値を保持します。 –

8

コードは `TreePanel.onを行っている場合は( 'クリック'、showDocumentFromTree)」は、それはshowDocumentFromTreeを呼び出すではない、それは引数として機能showDocumentFromTreeを渡しです。それは、それがセットアップされているonclickイベントハンドラによって後で呼び出され、ノード引数が渡されます。

+0

ビンゴ。質問者が「コードへの参照」という概念を理解していることを確認してください。いくつかのデータを介して "命令ポインタ"をリセットするさらに別の方法。 – Roboprog

4

最初の行は、showDocumentFromTree関数をclickイベントにバインドします。 TreePanel.onに渡される内容は、呼び出し自体ではなく、showDocumentFromTree関数への参照です。

イベントが発生すると、トリガーオブジェクトを最初のパラメーターとして、バインドされた関数が呼び出されます。この場合、クリックされたDOMノードになります。多分、これはあまり明確ではありませんが、あなたはそれが実際にではなく、onメソッドの引数としての機能を渡していることがわかります、

TreePanel.on('click', function(node) { 
    showDocumentFromTree(node); 
}); 

OK:説明するために

、最初の行はに書き換えることができます。メソッド自体を呼び出します。

1

TreePanelはExtjsのクラス/コンポーネントです。あなたの最初の行:

TreePanel.on( 'click'、showDocumentFromTree);

clickハンドラをTreePanelクラスに割り当てています。つまり、TreePanelをクリックするたびに、showDocumentFromTree関数が呼び出されます。 TreePanelのクリックイベントの一部は、クリックイベントを「引き起こした」、つまり項目であったTreeNodeを渡すことです。

Ext.tree.TreeEventModelクラスで特異的にinitEventsdelegateClick、およびonNodeClickの機能を見て、この機能がどのように動作するか確認します。

0

ブラウザが関数の引数を提供していることについて他のポスターが言ったことを繰り返しながら、私は言語としてJavaScriptについて一般的な注意を払いたいと思っていました。 JavaScriptは、C++やJavaなどの言語とは異なり、関数シグネチャで定義されたパラメータを尊重しません。 、

doSomething(); 

doSomething(foo); 

doSomething(foo, bar); 

doSomething(foo, bar, baz); 

など。

をそれは署名で定義されたパラメータなしで呼び出された場合:下記のいずれかの方法でそれを呼び出すその後

function doSomething(myParam){ 
    ... Does Some Stuff 
} 

:これはあなたのような機能を持たせることができること欠落しているパラメータは未定義です。余分なパラメータにアクセスできるのは、すべての関数にあるargs配列だけです。

私はこれがあなたの質問に特定ではないことを知っていますが、文脈や一般的な利益には良いかもしれないと思いました。

関連する問題