2011-03-05 64 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