0

我需要“检测”某些第三方函数何时返回,然后执行我自己的函数。

示例:一些我没有写的函数

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)因此 bar 不会 "find" 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..
4

3 回答 3

3

如果foo是一个全局函数,你可以像这样使用.apply()and来挂钩它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()

  1. 从传递给foo. 要么将相同的参数传递给,要么bar查看传递给foo的参数并从中创建参数bar
  2. 每次都让他们做同样的事情。 您只需将其编码到新函数中。听起来这不是你想要的。
  3. foo被调用之前,将所需的参数bar放入某种全局可访问的变量中,然后在您的替换函数中,您可以从该全局变量中获取它们。
  4. foo被调用之前,将所需的参数bar放入某种闭包中,以便您可以从替换函数中的闭包中获取它们。
于 2012-09-02T19:47:34.073 回答
1

您可以使用function.apply将 传递arguments给函数

var tmp = foo;
foo = function(params1) {
  tmp.apply(this, arguments);
  bar(params2);
}
于 2012-09-02T19:47:41.570 回答
1

也许你应该使用一个简单的pubSub系统来在调用 foo 时得到通知。这将解耦您对barfrom的调用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)
} );
于 2012-09-02T20:12:56.733 回答