1

後で実行される関数を実装するカスタム オブジェクトがあります。誰かがそれを呼び出す方法は次のとおりです。

customObject.onSomething(function(e) {
    // do something with e
    console.log('foobar');
});

onSomething の作成方法は次のとおりです。

var CustomObject = function() {
    this.onSomething = function(callback) {
        // If the user passes in parameter(s), how can I modify them before calling?
        callback.apply(this);
    }
}

関数で適用または呼び出しを実行する前に、ユーザーが渡した引数を変更するにはどうすればよいですか?

4

2 に答える 2

8

apply関数に渡す引数のリストである 2 番目のパラメーターを取ります。call独自の引数リスト (として使用される最初のパラメーターの後のすべて) を渡すことを除いて、同じことを行いますthis

したがって、期待するパラメーターがわかっている場合は、それらを呼び出し関数に の 2 番目のパラメーターとしてapply(または のパラメーターのリストとしてcall)追加するだけです。

this.onSomething = function(arg1, arg2) {
   // reverse the first and second arguments
   callback.apply(this, [arg2, arg1]);
   // equivalent:
   callback.call(this, arg2, arg1);
};

どのような種類の引数が期待されるかわからないが、それらを使って何かをしたい場合はarguments、現在の関数に与えられた引数を保持する組み込みの疑似配列を使用して行うことができます (宣言しない場合でも)。それらを明示的に)。

これを使用して、呼び出し関数に与えられた同じ引数、またはそれらの何らかの変換でコールバックを呼び出すことができます。例えば:

this.onSomething = function() {
    // call callback with the same arguments we got
    callback.apply(this, arguments);

    // or, make some changes
    var newArgs = ["extra argument", arguments[1], arguments[0]];
    callback.apply(this, newArgs);
};
于 2012-10-13T20:27:14.097 に答える
1

あなたが求めているのはかなり単純なように思えます。以下を参照してください。

var CustomObject = function() {
    this.onSomething = function(callback, param1, param2) {
        param1 += 4;
        param2 = 'Something about ' + param2 + ' is different...';
        callback.apply(this, [param1, param2]);
    }
}
于 2012-10-13T20:27:23.187 に答える