执行函数时,jQuery/Javascript会收到通知

Tam*_*Pap 2 javascript jquery bind notify observer-pattern

var f = function() {
    // Do something useful here
};
Run Code Online (Sandbox Code Playgroud)

有没有办法'观察'这个功能,并在执行时得到通知?类似于jQuery中绑定的东西,但我想绑定函数而不是dom事件?

不想要这样的东西:

var f = function() {
    // Do something useful here
    notifyObserver();
};
Run Code Online (Sandbox Code Playgroud)

但是我想要这样的东西:

f.bind(function() {
    alert('F was executed.');
});
Run Code Online (Sandbox Code Playgroud)

And*_*ker 6

您可以使用调用notifyObserver的函数替换f:

f = (function(oldF){
      return function(){
        notifyObserver(); 
        oldF(); 
      }; 
    })(f);
Run Code Online (Sandbox Code Playgroud)

这样你就不需要修改(旧的)f本身.bind当然,这不包括您的功能.我可能会为此创建一些管理器类,您可以在其中注册事件处理程序

manager.bind('f', function(){...});
Run Code Online (Sandbox Code Playgroud)

并且创建包装函数看起来更像

f = (function(oldF){
      return function(){
        manager.notify('f');
        oldF(); 
      }; 
    })(f);
Run Code Online (Sandbox Code Playgroud)

您可以概括包装器的创建:

function wrap(methodToWrap, eventName){
    return function(){
        manager.notify(eventName);
        return methodToWrap.apply(this, arguments);
    }
}
Run Code Online (Sandbox Code Playgroud)

(这适用于任意数量的参数和返回值!)

然后做一些像:

f = wrap(f, "f");
Run Code Online (Sandbox Code Playgroud)

请参阅:http://jsfiddle.net/NBefc/2/(已更新,没有返回值)

  • 很棒的解决方案,安德烈.我只想补充一点,假设f不带任何参数.但是对于[这个的快速演示](http://jsfiddle.net/NBefc/),我把一个用这种函数替换`alert`的程序汇集在一起​​.它也需要一个参数,但我不确定如何动态处理多个.该演示只是将console.count添加到正常的警报功能. (2认同)