1

名前以外にその関数に関する知識がなくても、特定の関数が実行されるたびに何かを実行することは可能ですか?

これは次のようになりますbind

var clicked = 0;
$('#foo').bind('click',function(){
    clicked += 1;
    alert(clicked);
});

そのため、ID を持つものがクリックされるたびfooに、変数に 1 が追加されるclickedため、クリックされた回数がわかります。正しい構文であれば、私がやりたいことは次のようになります。

var fired = 0;
$('my_function').bind('run',function(){
        fired += 1;
        alert(fired);
});

任意の状況で、いつでも関数について何かを理解し、それを使用できるかどうかは気にしません。回避策は必要ありません。これが私が答えたいものです:

関数の名前を指定するだけで、特定の関数が実行されるたびに何かを実行する方法。それが不可能な場合、それはなぜですか?

4

5 に答える 5

2

次のようなことを試してください:

var temp = my_function, fired = 0;
my_function = function() {
    fired++;
    temp.apply(this,arguments);
}
于 2013-06-19T22:52:32.567 に答える
1

このようなものがあなたが来ることができる最も近いかもしれないと思います:

function adjustFunctionToCount(f){
    var count = 0;
    function newF(){
        count++;
        f.apply(this, arguments);
    }
    newF.getCount = function(){ return count; };
    return newF;
}

そして、あなたが持っているなら

function handler(val){
    console.log('called with val ' + val);
}

あなたができる

handler = adjustFunctionToCount(handler);
handler('a');
handler('b');
console.log(handler.getCount());

フィドル

言うまでもなく、関数をインラインで作成できます

var handler = adjustFunctionToCount(function(val){ console.log('called with val ' + val); });

handler('a');
handler('b');
console.log(handler.getCount());

更新されたフィドル

于 2013-06-19T22:58:41.180 に答える
0

一般的なケースでは不可能だと確信しています。

関数は実際にはオブジェクトであり、関数の名前は単なる変数であることを忘れないでください。関数は、名前付き変数に割り当てられていなくても存在できます。変数はスコープ外にあるか、再割り当て/交換されている可能性があります。いずれにせよ、JS 関数呼び出しにフックできる API を私は知りません。

これは興味深いかもしれません:直接呼び出された関数をインターセプトできますか?

于 2013-06-19T22:53:30.843 に答える