16

タイトルの言い回しが正しいのか、もっといい言い方があるのか​​はわかりませんが、大丈夫だと思います。

とにかく、これまでのところ、次のことを理解しています。

a.b("a", "b", "c", foo);

「foo」は、引数を取らない他の場所で定義された関数であり、上記のパラメーターを使用して関数 ab() が実行されるだけです。パラメータ「foo」は、関数 ab() 内で単に「foo()」として呼び出すことができます。つまり、上記の呼び出しは、関数 ab の引数として関数ポインターをパラメーターとして使用していると理解しています。

さて、ここで私がやろうとしていることは...

上記と同様のことを実行できるようにしたいのですが、今回は次のように foo にその引数にパラメーターを渡す必要があります。

a.b("a", "b", "c", foo("bar"));

ここに問題があります。これは文字通り、パラメータ "a"、"b"、"c" と、使用されているfoo("bar") の結果になります。私はこれをしたくありません。foo("bar") が文字通り渡されるようにして、関数 ab で次のようにします (ヘッダーとして):

a.b(first, second, third, fourth);

4 番目のパラメーターを次のように参照して呼び出すことができます。

fourth();

「4番目」に引数が含まれていても。この問題を回避する方法が見つからないようです。何かアドバイスはありますか?

ありがとう!

4

2 に答える 2

26

匿名関数を使用してfoo呼び出しをラップします。

a.b("a", "b", "c", function() {return foo("bar");});

this与えられる値を保持する必要がある場合は、 を使用して呼び出すことができます.call。与えられた引数を渡すこともできます。

a.b("a", "b", "c", function(arg1, arg2) {return foo.call(this, "bar", arg1, arg2);});

もちろん、関数は必ずしも匿名である必要はありません。名前付き関数も同様に使用できます。

function bar(arg1, arg2) {
    return foo.call(this, "bar", arg1, arg2);
}
a.b("a", "b", "c", bar);
于 2012-11-30T03:38:09.560 に答える
1

関数でBINDを使用するのは本当に簡単です

a.b("a", "b", "c", foo.bind(undefined, "bar"));

したがってfoo()、関数内で呼び出すと、最初のバインドされた引数が既にあります。を使用して、必要なだけ多くの引数を適用できますbind

bind常に引数を関数に適用し、それらを最初に配置することに注意してください。に申請して使用する場合:

    if (!Function.prototype.bindBack) {
    Function.prototype.bindBack = function (_super) {
        if (typeof this !== "function") 
            throw new TypeError("Function.prototype.bindBack - can not by prototyped");

    var additionalArgs = Array.prototype.slice.call(arguments, 1), 
        _this_super = this, 
        _notPrototyped = function () {},
        _ref = function () {
            return _this_super.apply((this instanceof _notPrototyped && _super) ? this : _super, (Array.prototype.slice.call(arguments)).concat(additionalArgs));
        };

    _notPrototyped.prototype = this.prototype;
    _ref.prototype = new _notPrototyped();

    return _ref;
  }
}

function tracer(param1, param2, param3) {
console.log(arguments)
}

function starter(callback) {
callback('starter 01', 'starter 02')
}
// See here!!!
// function starter call 'calback' with just 2 params, to add 3+ params use function.bindBack(undefined, param, param, ...)                
    starter(tracer.bindBack(undefined, 'init value'));

例を参照http://jsfiddle.net/zafod/YxBf9/2/

于 2012-11-30T04:18:20.353 に答える