2009-06-06 186 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)

謝謝你的時間, Ĵ

+1

如果您覺得這一行: TreePanel.on('click',showDocumentFromTree); 調用函數showDocumentFromTree(我在這裏猜測),那麼你錯了。它只是記錄在某個時刻被調用的函數。 – airportyh 2009-06-06 01:28:34

+0

對於在jQuery占主導地位的時代使用Extjs +1。 :) – 2009-06-06 02:10:37

回答

0

在這種情況下,showDocumentFromTree的參數是瀏覽器在用戶單擊附加動作的元素時提供的魔術參數。在這種情況下,node將參考TreePanelJavascript - The this keyword解釋了這個機制的更多細節。在您的示例中,使用參數名稱thisnode更常見。

8

當代碼是做`TreePanel.on( '點擊',showDocumentFromTree)」,它調用showDocumentFromTree,這是傳遞功能showDocumentFromTree作爲參數。然後它會被onclick事件處理程序調用,然後它將被傳遞它的節點參數。

+0

賓果。我想,請確保提問者理解「參考代碼」的概念。另一種通過某些數據重置「指令指針」的方法。 – Roboprog 2009-06-06 01:50:27

4

第一行將showDocumentFromTree函數綁定到click事件。傳遞給TreePanel.on的內容是對showDocumentFromTree函數的引用,而不是調用本身。

當事件觸發時,將調用綁定函數,觸發對象作爲第一個參數。在這種情況下,它將是被點擊的DOM節點。

爲了說明,第一行可以被改寫爲:

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

好吧,也許這是不是更清晰,但你可以看到,它實際上通過一個函數作爲參數傳遞給on方法,而不是調用方法本身。

1

TreePanel是Extjs中的類/組件。在你的第一行:

TreePanel.on('click',showDocumentFromTree);

您正在爲TreePanel類指定一個click處理程序。意思是,每當TreePanel被點擊時,它會調用你的showDocumentFromTree函數。 TreePanel的點擊事件的一部分是傳遞發起或導致點擊事件的項目TreeNode

要了解此功能的工作原理,請參閱Ext.tree.TreeEventModel類,具體爲initEvents,delegateClickonNodeClick函數。

0

無論重複其他海報對瀏覽器提供函數參數所說的話,我想對javaScript作爲一種語言作一般性說明。與C++和Java等語言不同,JavaScript不尊重函數簽名中定義的參數。這意味着你可以有這樣一個功能:

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

然後調用它在以下任何方式:

doSomething(); 

doSomething(foo); 

doSomething(foo, bar); 

doSomething(foo, bar, baz); 

等。

如果它被稱爲沒有簽名定義的參數中,缺少參數將是未定義的。額外的參數只能由所有函數所具有的args數組訪問。

我知道這不是特定於您的問題,但我認爲這可能對上下文和一般興趣很有好處。