网站搜索

javascript - JS 中的函数调用事件?


是否有可能在调用时将一个函数绑定到另一个函数?例如,它大致会是这样的:

function a(){...}
function b(){...}
b.bind("onInvoke","a");

所以当调用 b 时,a 也会自动被调用。

编辑:好吧好吧,澄清一下,这不是关于链式调用的问题。这个想法是找到一种优雅的方式来进行事件绑定。观察使用普通函数回调的正常“非优雅”方式:

function handler(){...}
function caller1(){handler(); ...}
function caller2(){handler(); ...}
function caller2(){handler(); ...}
// More callers all over your website everywhere else

那可以吧?但是如果我的调用者到处都是呢?很难组织或更改东西。

现在观察更优的解决方案!(如果存在的话)

function handler(){...}
// Caller make no reference to handler on creation
function caller1(){...}
function caller2(){...}
function caller3(){...}
// Caller function are still all over the place, all over your website
// Event handler registered later in one location here, doesn't matter where they are phsically
caller1.bind("onInvoke",handler);
caller2.bind("onInvoke",handler);
caller3.bind("onInvoke",handler);

非常像你平常的 HTML - JQuery 事件注册。你不会在用户可能点击的每个图片上写 onClick(这些图片到处都是),这样组织起来会非常麻烦!你只需要写一个简单的

 $("img").bind("onClick",click_handler);

适用于您整个网站。这就是我所寻找的要点,只是没有包括 JS 函数。

我希望这能澄清事情。

编辑 2:需要兼容 IE7!!!JavaScript 1.8.5 很棒,但现在没有任何东西支持它。

答案#1

你可以用面向切面的方法来做这件事。这里有一个简单的例子:

将对 a() 的调用附加到函数 b():

var _b = b;
b = function(){
   _b();
   a();
}

现在调用 b():

b();

在这里查看它的实际效果: http://jsfiddle.net/eZ9wJ/

答案#2

有各种解决方案,取决于你想要设计多少。一种简单且灵活的方法是创建一个链式实用函数:

function chain() {
   var args = arguments;
   return function() {
      // loop through arguments and invoke all functions
      for(var i = 0; i < args.length; i++) {
         if(typeof args[i] == "function")
            args[i]();
      }
   }
}

这段代码的作用是返回一个新的函数,该函数将按顺序调用提供的函数。使用方法如下:

var myChain = chain(b, a);
myChain();