为什么在使用click事件处理程序时会执行非匿名函数?

我一直在探索为事件处理程序使用自定义函数。 在这个简化的示例中,我试图在用户单击按钮时弹出警报。

但是当页面加载时,警报框会立即弹出! 我究竟做错了什么? (评论部分完全相同)。

如果我定义bclick()函数就好

function bclick(foo, bar){ ... } 

结果也是一样的。

头文件中的JS:

  var bclick = function(foo, bar){alert( foo + " " + bar + "\n");} //$(document).ready(function(){ // $("button").click(bclick("Button","Clicked")); // }); $("button").click(bclick("Button","Clicked"));  

正文中的相关HTML:

  

您甚至在通过它之前都在评估您的function。

 $("button").click(bclick("Button","Clicked")); 

这里,使用这些参数调用bclick结果将传递给click方法。 你想像普通变量一样传递它,如下所示:

 $("button").click(bclick); 

但是,显而易见的问题是,您无法传递自定义参数。

您还可以传入一个调用函数的匿名函数:

 $("button").click(function() { bclick("Button", "Clicked"); }); 

正如musicfreak所说。 但是如果你想要变得非常棘手并且使用你拥有的代码,那么你只需要在你的bclick函数结束时添加return this

如果要在设置事件处理程序时传递参数,另一种方法是返回一个函数。

 $("button").click(bclick("Button","Clicked")); function bclick(foo, bar) { // called once when the event handler is setup return function(e) { // called every time the event is triggered // you still have the original `foo` and `bar` in scope, // and a new `e` (event object) every time the button is clicked console.log(foo, bar, e); }; }