从jQuery Event访问函数中的参数*和*事件

这是我不久前问过的另一个问题的后续问题。 通常,您可以从jQuery事件访问函数调用中的事件,如下所示:

$item.live("click", functionToCall); 

并在function:

 function functionToCall(ev) { // do something with ev here, like check 'ev.target' } 

但是如果我想将一个参数发送到functionToCall() 访问该事件呢? 也许这样的事情呢? :

 $item.live("click", functionToCall($(this)); // send over parameter this time 

 function functionToCall(ev, $clickedItem) { // both accessible here? alert(ev.type); alert($clickedItem.attr('id')); } 

这是可以接受的,还是有不同的方式发送参数? 因为这种方式对我来说似乎不对。 任何帮助,将不胜感激。 谢谢。

澄清:我意识到一个匿名的回调函数可以让我访问这两个,但由于各种原因太长而无法进入这篇文章,我需要使用函数调用而不是匿名函数。 所以我的问题严格处理需要调用外部函数的场景。 谢谢。

更新:我的原始问题提出了需要将$(this)作为参数传递给外部函数的场景。 事实certificate,$(this)将在函数中可访问,甚至不需要传递它,因为jQuery基于事件将值重新分配给“this”。 所以执行此代码应该适用于我原来的问题:

 $item.live("click", functionToCall); 

 function functionToCall(ev) { alert(ev.type); alert($(this).attr('id')); // display id of item that was clicked } 

但是,正如其他人已经回答的那样,有一种不同的场景需要将不同类型的变量作为参数传递,例如简单的字符串或int。 在这种情况下,正如其他人所说,它变得更加复杂。 但这里似乎有足够的答案来满足第二种情况(即“currying”)。 谢谢。

您可以咖喱或部分应用您的function:

像这样的东西:

 function functionToCall($clickedItem) { return function (ev) { // both accessible here alert(ev.type); alert($clickedItem.attr('id')); } } 

然后你可以像你想要的那样使用它:

 $item.live("click", functionToCall($(this)); 

注意:如果你不能修改原来的functionToCall因为它是“外部的”,你可以把它包起来:

 function wrapFunctionToCall($clickedItem) { return function (ev) { // call original function: functionToCall(ev, $clickedItem); } } // ... $item.live("click", wrapFunctionToCall($(this)); 
 .live('click', functionA(prm) { return function(ev) { // here you can use the prm and the event } } 

我知道问题的答案,但是对于它的价值,如果您不想编辑原始函数,这里的单行程也可以正常工作:

 $item.live("click", function() { functionToCall( $(this) ); });