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();
