我需要“检测”某些第三方函数何时返回,然后执行我自己的函数。
示例:我没写的某些功能
function foo(params1){
console.log(params1);
}
我的职能:
function bar(params2){
console.log(params2);
}
我需要在调用foo
时,它会立即调用bar
!
我试过这种方式:
foo = function(params1){
console.log(params1);
bar(params2);
}
意思是我“覆盖”foo
..但有时(总是),foo
代码太冗长+传递params2
(次要)问题。
我尝试了原型的绝望尝试......但后来我想我需要一些支持。
我也试过这个:(但)
var tmp = foo;
foo = function(params1) {
tmp(params1);
bar(params2);
}
此处的问题相同,来电者会致电foo(params1)
,因此酒吧不会“找到”params2
。
我需要这样做一个像“事件处理程序”的东西
第三方函数进行一些ajax调用,对DOM起作用,我立即采取行动
这样做有一个简洁的方法吗?我希望这很有趣。谢谢。
ps:我虽然关于params2
全局,但我仍然需要一个“原创”解决方案:)
关于params2
的使用,假设我想为我想要挂钩的每个函数使用不同的参数。
的示例:
var tmp = foo_1;
foo_1 = function(params1) {
tmp(params1);
bar(params2);
}
tmp = foo_2;
foo_2 = function(params1) {
tmp(params1);
bar(params3);
}
//etc..
答案 0 :(得分:3)
如果foo
是一个全局函数,您可以使用.apply()
和arguments
将其挂钩:
var oldFoo = foo;
foo = function() {
// call oldFoo with whatever arguments were passed
var returnVal = oldFoo.apply(this, arguments);
// do your thing
bar(params2);
// if oldFoo had a returned value, return it here
return(returnVal);
}
您可以在致电原件之前或之后完成工作。 .apply()
和arguments
允许您将原始参数(无论它们是什么)传递到foo
,而您甚至不必知道它们是什么。
在你的代码示例中,你没有说params2
来自哪里,所以我们很难知道如何将它们注入。你可以从传递给foo
的原始参数中提取它们,你可以将它们构建到函数中或从某个对象中检索它们。
您可以选择确定params2
应该是什么,并将它们适当地传递给bar()
:
foo
的参数中派生出来。要么将相同的参数传递给bar
,要么查看传递给foo
的参数然后从那些创建bar
的参数。foo
被调用之前,将所需的参数放入bar
某种全局可达变量中,然后在替换函数中,您可以从全局获取它们foo
之前,将所需的参数放入bar
进行某种关闭,这样您就可以在替换函数中从闭包中获取它们。答案 1 :(得分:1)
您可以使用function.apply将arguments
传递给功能
var tmp = foo;
foo = function(params1) {
tmp.apply(this, arguments);
bar(params2);
}
答案 2 :(得分:1)
也许您应该使用简单的pubSub系统在foo被调用时收到通知。这会将您bar
的呼叫与foo
分开。
(function(){
var footmp = foo;
foo = function(){
var result = footmp.apply(this, arguments);
PubSub.publish('fireBar');
return result;
}
})()
PubSub.subscribe( 'fireBar', function(){
// try to figure out whats params2
bar(params2)
} );