1

为什么不能使用定义的函数作为事件回调?

<div id="me">
  <input>
</div>

$(document).ready(function(){
  // $("#me").on('keyup', 'input', doit()); # doesn't work
  // $("#me").on('keyup', 'input', 'doit'); # neither does this
  $("#me").on('keyup', 'input', function() {
    doit();
  }); // well, this one works of course
});

function doit() {
  console.log($("input").val());
}
4

4 回答 4

8

您需要将函数作为参数传入。

$("#me").on('keyup', 'input', doit);
于 2013-08-30T17:06:53.647 回答
6

你应该传递函数,而不是调用它

$("#me").on('keyup', 'input', doit)

要清楚为什么这是错误的,请参见以下示例:

$("#me").on('keyup', 'input', (function() {
  doit();
})()); 

在这里,您传递了一个匿名函数并立即调用它,这不是事件处理程序所期望的。

问题不在于匿名与否之间的区别,问题在于您调用的是函数而不是传递它。

于 2013-08-30T17:07:09.000 回答
2

当您传入doit()(带有" ()") 作为回调时,您实际上是在该点运行函数并将函数的返回值(可能undefined)作为回调传入。如果您仅传入对命名函数的引用,doit则该函数将作为回调执行。

于 2013-08-30T17:10:29.053 回答
1

当你在 js 中说 something=function(){ blah } 时,它会将其存储为文本并即时解析它 - 所以是的,你可以。例如:

CallMe = function(){ alert("blah!"); }
bobsCallback.setFunction( CallMe );

CallMe 与任何其他变量一样,但它的内容是函数的 js。您可以将它作为回调传递,或者像这样调用:

alert("calling CallMe...");
CallMe();
于 2013-08-30T17:10:06.827 回答