2011-03-05 13 views
3

從我個人理解,在jquery的,當一個方法需要一個函數作爲參數,你不能只是調用預定義的函數是這樣的:功能jQuery的方法參數,無需編寫整個函數定義

$('#target').click(myFunction()); 

...因爲「myFunction()」將被解析並替換爲函數返回的值,該函數不再是函數。您必須將整個函數定義放在匿名函數中:

$('#target').click(function() { 
    alert('Handler for .click() called.'); 
}); 

...所以,有沒有什麼辦法可以調用函數它需要作爲一個參數?

回答

4

你理解正確。不僅在jQuery中,這是JavaScript的工作原理。當需要函數作爲參數時,則必須給函數作爲參數,而不是調用的結果。你可以使用這個:

$('#target').click(myFunction); 

但爲了提醒你需要一個匿名函數,因爲你傳遞了一個參數。

+4

+1附錄:JavaScript中的函數是*對象*,可以通過'()'運算符應用[讀:調用]。也就是說,'fn()'將函數對象(例如'fn'爲'fn = function(){...}'或者函數fn(){...}''然後'()'操作符調用函數對象,並且表達式的值是該調用的結果[讀:什麼是'返回']。因此,如果沒有'()'運算符,函數的名稱就會計算到函數對象本身。 (這與Java/C/C++/C#(甚至Ruby)的工作原理有很大不同,但與Python相似) – 2011-03-05 17:06:57

+0

謝謝...所以你不能用參數調用它:$('#target') .click(myFunction(arg1,arg2)); ? – bogdan 2011-03-05 17:11:09

+4

@bogdan你可以 - 但它傳遞'myFunction(arg1,arg2)'的*結果*作爲'click'的值[見'()']。這是一個閉包的情況:'elm.click(function(){myFunction(arg1,arg2)})',其中'arg1'和'arg2'是封閉範圍中的自由變量。注意'function(){...}'返回的函數對象是* not *求值(applied/invoked),而是作爲參數傳遞給'click' - click將調用傳入的函數對象稍後當事件發生時,該(匿名)函數對象使用給定變量(希望)在閉包中綁定'myFunction'。 – 2011-03-05 17:13:18

2

您正在傳遞函數的結果,而不是函數本身。相反的:

click(myFunction()); 

使用

click(myFunction); 

直播example on jsfiddle