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()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 が呼び出されたときに通知を受け取る必要があるかもしれません。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)
} );
于 2012-09-02T20:12:56.733 に答える