为什么jQuery中的回调必须是匿名的?

时间:2014-01-08 12:38:11

标签: javascript jquery jquery-callback

这与预期一样,但我不喜欢它。

$('#login-form').on('submit', function(event){
  event.preventDefault();
  init.login();
});

var init = {
  login: function() {
  // do login stuff
  }
};

这就是我想要的,但它不起作用。

$('#login-form').on('submit', init.login(event));

var init = {
  login: function(event) {
  event.preventDefault();
  // do login stuff
  }
};

为什么?

3 个答案:

答案 0 :(得分:8)

它会工作,你正在调用函数(作为回调给出的值将是函数的结果)而不是将其作为值传递

$('#login-form').on('submit', init.login);

答案 1 :(得分:5)

init.login(event) 调用函数init.login,将(不存在的)变量event传递给它。如果要将函数本身作为回调传递,请不要调用它:

$('#login-form').on('submit', init.login);

您必须在传递之前声明该功能,此时init.loginundefined

答案 2 :(得分:4)

您已经在该行中调用该函数(使用undefined,但还没有event)。你需要传递函数本身(而不是它的结果):

$('#login-form').on('submit', init.login);

请注意,init.login仍然是一个匿名函数,它没有名称:-)还要注意调用该方法时this是登录表单元素,而不是init对象。如果您需要,可以使用.on('submit', init.login.bind(init))