aは関数なので、 `a.call.call`は本当に何をしていますか?
これらのコードはchrome devtoolで実行されます。
(a.call.call
と同じ)は、関数である最初の引数を呼び出していて、次に2番目の引数をthis
として渡しているようです。 最初の引数が関数でない場合は、not a function
エラーをスローします。
どのように説明できますか<Function>.call.call
?基本的なものから始めて
aは関数なので、 `a.call.call`は本当に何をしていますか?
これらのコードはchrome devtoolで実行されます。
(a.call.call
と同じ)は、関数である最初の引数を呼び出していて、次に2番目の引数をthis
として渡しているようです。 最初の引数が関数でない場合は、not a function
エラーをスローします。
どのように説明できますか<Function>.call.call
?基本的なものから始めて
正しいです。
3210なぜですか?
我々はa.call(b)
手段はでこの値b
をa()
を呼び出す知っています。
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
を呼び出すようにしてください。
希望します。
、
.call
は何ですか?その関数はFunction.prototype
の中で利用できます。 それはどんな関数でも呼び出すことができるので、なぜあなたはa.call
に電話できるのですか?
今、とは何ですか? .call
を呼び出した関数のコンテキストをthis
に設定します。したがって、あなたのケースでは、a.call
と呼ぶと、a
のthis
文脈を(.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.call
がFunction.prototype
またはObject
に呼ばれている必要がありますに
(ここでは最初の.call
へthis
は、このケースでは、あなたの機能時代遅れa
を作る二.call
から来ている)を呼び出すとすぐに関与していない または任意の他の機能(.call
を覚えてFunction.prototype
の一部であり、すべての関数で呼び出すことができます)
ので、あなたは
Function.prototype.call.call(...)
を行っている必要があります あるいは
Object.call.call(...)
今私はこれらの事先週(ない.call.call
しかし.call.bind
)について混乱していた、私はここに質問をして、誰かが非常に詳細に私にそれを説明し、あなたはそれをHERE
私は私が質問した質問から私の理解から答えようとしました。
このすべてがSO
UPDATEのためには何かということです後:あなたは(a.call.callと同じ)b.callがある最初の引数を、呼び出しているように思え、」質問
最初の引数が関数でなければ、関数エラーではありません。 "
あなたの仮定は、私はあなたの例をお見せしましょう、ここ
"[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
@jeroen私はすでにMDNでその文書を読んでいますが、 'call'関数がどのように働くかを説明し、いくつかの例を挙げています。私がここで正確に尋ねるのは 'call.call'です。その動作は' call'とは異なります。そして私は 'call.call'の背後にある作品を手に入れることはできません。 – tjfdfs
'.call()'への最初の引数は、 'call()'が動作する関数の 'this'値として設定したいオブジェクトです。 'call()'自体が '.call.call()'をチェーンしているために操作される関数であれば、それは 'this'値で何をしますか?それはそれが関数であると仮定し、それを呼び出そうとします。しかし、最後のコード行は関数を渡さず、空のオブジェクトを渡します。 – nnnnnn