2016-01-21 40 views
8

enter image description hereaは関数なので、 `a.call.call`は本当に何をしていますか?

これらのコードはchrome devtoolで実行されます。

a.call.callと同じ)は、関数である最初の引数を呼び出していて、次に2番目の引数をthisとして渡しているようです。 最初の引数が関数でない場合は、not a functionエラーをスローします。

どのように説明できますか<Function>.call.call?基本的なものから始めて

+0

"[Warlords of Documentation](http://meta.stackoverflow.com/q/303865/419956)" a.k.a. "NullReference"はまだあなたの質問が多分広すぎるまで、ここにはありません。それまでは、[MDN](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/call)などの他のリソースをお勧めします。 – Jeroen

+0

@jeroen私はすでにMDNでその文書を読んでいますが、 'call'関数がどのように働くかを説明し、いくつかの例を挙げています。私がここで正確に尋ねるのは 'call.call'です。その動作は' call'とは異なります。そして私は 'call.call'の背後にある作品を手に入れることはできません。 – tjfdfs

+1

'.call()'への最初の引数は、 'call()'が動作する関数の 'this'値として設定したいオブジェクトです。 'call()'自体が '.call.call()'をチェーンしているために操作される関数であれば、それは 'this'値で何をしますか?それはそれが関数であると仮定し、それを呼び出そうとします。しかし、最後のコード行は関数を渡さず、空のオブジェクトを渡します。 – nnnnnn

答えて

8

正しいです。

​​3210

なぜですか?

我々はa.call(b)手段はでこのba()を呼び出す知っています。

a.call.call(b)手段はFunction.prototype.call.call(b)同じこの値bを、Function.prototype.call()を呼び出すようにするため。

しかし、Function.prototype.call.call()は、通常の関数オブジェクトではありません。呼び出すことはできますが、プロパティはありません。一部の独自のルールが呼び出されています。実際に

Function.prototype.call.call(a) // 1 

Function.prototype.call.call(b) // 2 

Function.prototype.call.call(b)は、また、結合した機能エキゾチックオブジェクトエキゾチックなオブジェクトです。

  • [仕様]バウンド関数は、別の関数オブジェクトをラップするエキゾチックオブジェクトです。

  • [仕様]バインドされた関数を呼び出すと、一般にラップされた関数が呼び出されます。

したがって、Function.prototype.call.call(a)は、単にa()を意味します。

a.call.call(x)は、xを呼び出すことを意味します。つまり、x()です。

  • [仕様] Function.prototype.call(thisArg)でthisArgが未定義またはnullの場合、グローバルオブジェクトに置き換えられます。

a.call.call()a.call.call(undefined)a.call.call(window)手段がwindowを呼び出すことを意味します。

あなたがUncaught TypeError: window is not a functionを取得するので、あなたはUncaught TypeError: a.call.call is not a functionを得るでしょうa.call.call()を起動しようとするでしょうwindowを呼び出すようにしてください。

希望します。

1

.callは何ですか?その関数はFunction.prototypeの中で利用できます。 それはどんな関数でも呼び出すことができるので、なぜあなたはa.callに電話できるのですか?

今、とは何ですか? .callを呼び出した関数のコンテキストをthisに設定します。したがって、あなたのケースでは、a.callと呼ぶと、athis文脈を(.call関数に渡す最初のパラメータを通して)設定することができます。

.callの内部にはthisとは何ですか?それは、あなたが(aあなたの場合)に.callを呼び出した関数に他なりません
ので、簡単にするために、あなたが想定し、.callの内側には、this() のような関数を呼び出すことがあります(そしてそれはa()を呼び出す以外の何ものでもありません) - これまでのところここで何が起こっているのか、あなたの質問

a.call.call 

良いですか? 2番目の.call(私は左から右に数えています)は、最初の.callを呼び出し、最初の.callのためにthisを設定します。これは関数である最初のパラメータです。

今すぐ最初に.callが呼び出されます(これは2番目の.callによって設定され、最初に渡されたパラメータであり、これは関数です)。

私は、私が説明しようとしていたものを説明することができます。

a.call.callと混同した理由を教えてください。あなたは私の機能がどこにあるのかと思っているからです。aこの混乱のなかで何が起こったのですか?実際にヨーヨーが第二の.callあなたはケース.call.callFunction.prototypeまたはObjectに呼ばれている必要がありますに

(ここでは最初の.callthisは、このケースでは、あなたの機能時代遅れaを作る二.callから来ている)を呼び出すとすぐに関与していない または任意の他の機能(.callを覚えてFunction.prototypeの一部であり、すべての関数で呼び出すことができます)

ので、あなたは

Function.prototype.call.call(...) 
を行っている必要があります

あるいは

Object.call.call(...) 

今私はこれらの事先週(ない.call.callしかし.call.bind)について混乱していた、私はここに質問をして、誰かが非常に詳細に私にそれを説明し、あなたはそれをHERE

を見つけることができます

私は私が質問した質問から私の理解から答えようとしました。

このすべてがSO

UPDATEのためには何かということです後:あなたは(a.call.callと同じ)b.callがある最初の引数を、呼び出しているように思え、」質問

最初の引数が関数でなければ、関数エラーではありません。 "

あなたの仮定は、私はあなたの例をお見せしましょう、ここ

+0

ありがとう!私はあなたの答えとリンクを2回読んでいくつかのアイデアを得るでしょう。 – tjfdfs

+0

あなたの前提が正しいと私はそれをキャプチャする私の答えを更新 – Oxi

+0

理解しやすい例でこれを関連させてください。 –

関連する問題