我需要将此函数作为DOM事件的回调传递

var fooo = function() {
  $(this).append("foo");
  fooo = function() {
     $(this).append("bar");
  };
};

$("#hover").hover(fooo);​


此示例应在“ foo”之后添加“ bar”,但是不起作用。我究竟做错了什么?

JSFiddle

最佳答案

您正在更改分配给fooo的函数,而不是分配给.hover的回调的函数。

为了清楚起见,当您传递函数作为事件的处理程序时(例如$().hover(fooo)的情况),您不是在传递fooo的变量,而是传递它指向的函数。如果您将fooo重新分配给其他内容,原始函数仍将作为事件处理程序绑定。

如果我想做您想做的事,那么我将使用稍微不同的范例。就像是

var fooo = (function() {
    var altBehavior = false;
    return function() {
        $(this).append(altBehavior ? "bar" : "foo");
        altBehavior = true;
    }
})();

$("#hover").hover(fooo);​


实际的绑定函数永远不会更改,但是它所存在的上下文会更改。

10-08 16:13