JS中的函数调用事件?

时间:2011-12-07 20:47:08

标签: javascript

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

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很棒,但是现在还没有任何支持。

4 个答案:

答案 0 :(得分:4)

您可以使用面向方面的方法来实现这一目标。 这是一个简单的例子:

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

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

现在调用b():

b();

在此处查看此行动:http://jsfiddle.net/eZ9wJ/

答案 1 :(得分: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();

答案 2 :(得分:0)

您可以使用回调:

function a(){
  // some code here
  b();
}
function b(){...}

观察者模式 - http://www.michaelhamrah.com/blog/2008/12/event-pooling-with-jquery-using-bind-and-trigger-managing-complex-javascript/

答案 3 :(得分:0)

JavaScript 1.8.5 / ECMAScript 5确实定义了bind function,但它没有按照您的描述进行操作;它允许您指定this上下文调用时的内容,并且可选地允许您对某些参数进行硬编码 - 咖喱。