使用定义的函数而不是匿名函数作为回调

时间:2013-08-30 17:05:52

标签: javascript jquery callback

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

<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 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:6)

您应该传递该功能,而不是调用它

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

要清除错误的原因,请参阅此示例:

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

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

alert("calling CallMe...");
CallMe();