13

私はES5Function.prototype.bindとカリー化引数(基本的に関数のデフォルト引数を作成する)の大ファンです。

私はそれで少し浮気していました、しかし私は私の人生のためにもう自分自身の構造を理解することができません。これは私の遊び場です:

function hello( arg1, arg2 ) {
    console.log('hello()');
    console.log('"this" is: ', this);
    console.log('arguments: ', arguments);
}

var foo = Function.prototype.call.bind( hello,{what: 'dafuq'}, 2 );
foo( 42 );

このためのログ出力は次のとおりです。

hello()
"this" is: Object{ what="dafuq" }
arguments: [2,42]

しかし、私は、オブジェクトが内部{what: 'dafuq'}の参照としてどのように進むのかを理解していません。私が理解している限り、私たちはへのバインドされた呼び出しを作成しています。MDNの概要をすばやく確認しましょう。thisfooFunction.prototype.call.bind()

fun.bind(thisArg[, arg1[, arg2[, ...]]])

したがって、thisArgfor.callhello関数であり、その後に引数リストが続きます。基本的に何が起こるかはこれです

Function.prototype.call.call( hello, {what: 'dafuq'}, 2);

...うーん、今、私の脳は少し痛いです。私は今何が起こるかについての考えを持っていると思いますが、誰かがそれを詳細に説明するための素晴らしいしっかりした言葉を見つけてください。

  • どのよう{what: 'dafuq'}になりますthis reference
4

3 に答える 3

8

呼び出している.bind(thisArg, args)のではなく、
Function.prototype.bind.call(thisArgUsedByCall, thisArgUsedByBind, argument)

何が起こるかを示す別の方法:

// thisArgUsedByCall is a function
Function.prototype.call(thisArgUsedByCall, ...)   // does the same as:
thisArgUsedByCall.bind(thisArgUsedByBind, argument);
于 2012-08-01T14:14:20.430 に答える
6

{what: 'dafuq'}しかし、私は、オブジェクトがfoo内でこれの参照としてどのように進むのかを理解していません

これfooは、事実上、呼び出し元のコンテキストとして関数がバインドされたcallメソッドであり、そのオブジェクトが最初の引数としてバインドされているためです。helloの最初の引数は.call 、呼び出しコンテキストの呼び出しコンテキストを設定します。あなたがそれをバインドしたので、それはオブジェクトが常に呼び出しコンテキストであることを意味します。


このように置いてください...

.callの呼び出しコンテキストをにバインドしましたhello

これは事実上、行うことと同じです...

   hello.call();
// or...
// Function.prototype.call.call(hello);

.callまた、の最初の引数をにバインドした{what: "dafuq"}ので、これは事実上、実行するのと同じです...

hello.call({what: "dafuq"});
// or...
// Function.prototype.call.call(hello, {what: "dafuq"});

そして最後に、の2番目の引数をにバインドした.callので2、これは事実上、実行するのと同じです...

hello.call({what: "dafuq"}, 2);
// or...
// Function.prototype.call.call(hello, {what: "dafuq"}, 2);
于 2012-08-01T14:14:54.217 に答える
2

簡単に言うと、bindは最初の引数を消費し、それをthisとして使用しますが、callは最初の引数(bindの2番目の引数)を消費します。

バインドは次のように機能します。

fun.bind(thisArg, argArgs...)(x, y, ...)

になります

fun(argArgs..., x, y, ....) // this = thisArg

それで

foo( 42 )

Function.prototype.call.bind( hello, { what: 'dafuq' }, 2 ) ( 42 )

これは

Function.prototype.call({ what: 'dafuq' }, 2, 42) // this = hello

呼び出しは次のように機能します。

fun.call(thisArg, argArgs)

になる

fun(argArgs) // this = thisArg

それで

call({ what: 'dafuq' }, 2, 42) // this = hello

になります

hello(2, 42) // this = { what: 'dafuq' }
于 2012-08-01T14:43:51.067 に答える