8

私はjavascriptで関数を持っています

function foo(callback) {
    console.log("Hello");
    callback();
}

そして別の機能

function bar() {
  console.log("world");
}

関数を作りたいFooBar

FooBar = foo.bind(this, bar);

これは問題なく動作しますが、実際にやろうとしているのは関数 queueを作成することです。多くの場合、次の例のように、コールバックをバインドする前に none 関数パラメーターをバインドする必要があります

function foo() {
    console.log(arguments[0]);
    var func = arguments[1];
    func();
}

function bar() {
    console.log("world");
}

foo.bind(this, "hello");
var FooBar = foo.bind(this, bar);

FooBar();

このエラーを生成する

[Function: bar]

TypeError: undefined is not a function

関数が他の非関数型にバインドされている場合、関数を別の関数にバインドするにはどうすればよいですか?

4

2 に答える 2

7

次のように、最初の の結果にバインド"Hello"しないでください。foobarfoobarbind

var FooHello = foo.bind(this, "hello");
var FooBar = FooHello.bind(this, bar);

ここでフィドル。(「Hello」、「world」をログに記録します)。

于 2013-06-16T20:34:41.843 に答える
4

bind メソッドは関数を互いにバインドしません。その目的は、関数が呼び出されたときに「this」キーワードと引数のコンテキストを修正することです。次に、元の関数を変更せずに、新しい関数を返します。

だから:foo.bind(this, "hello")実際には効果がありません。bind を 2 回目に呼び出すと、固定引数 の新しい関数が作成されますbar。エラーが発生する理由は、渡された引数が 1 つしかないため、arguments[1]定義されていないためです。

Richie の提案に従って中間変数を追加するか、両方の引数を単一のバインドで渡すことができます。

var FooBar = foo.bind(this, "hello", bar);

関数がいつ関数を処理しているかを検出できるように、ランタイム チェックも含めることをお勧めします。これにより、引数の順序について心配する必要がなくなります。

if(typeof func === 'function'){
  func();
}
于 2013-06-16T21:04:31.400 に答える