タイトル:
function fn(a,b){ console.log(this); console.log(a); console.log(a+b); } fn.call(1); fn.call.call(fn); fn.call.call.call(fn,1,2); fn.call.call.call.call(fn,1,2,3);
答え:
fn.call(1); // 1,unknown,NaN
fn.call.call(fn); fn,1,2); // 1,2,NaN
fn.call.call.call.call(fn,1,2,3); // 1,2,5
; :
fn .call(1); call の最初のパラメーターは、呼び出しの前に関数内のキーワード this を変更するため、その後にパラメーターがないため、a と b は未定義となり、加算結果は NaN になります。
fn.call.call(fn) ;この部分は難しいですが、理解するのは簡単です。 fn.call は Function.prototype で call メソッドを見つけます (これも関数であり、関数クラスのインスタンスです。引き続き call/apply やその他のメソッドを呼び出すこともできます)。fn.call を関数 A とみなすことができます。次に、次のステップは Equal to A.call(fn) です。ここで call メソッドを実行し、A のキーワード this を関数 fn に変更して、関数 A (fn.call) を実行します。 fn, 1,2); 前回の記事のプロトタイプチェーンメソッドにより、fn.call.call.call を A(fn.call.call).call の実行とみなすことができます。このとき、括弧内のパラメータ fn が実行されます。が関数として実行されたので、 A.call(1,2) の実行になります。 1 は、呼び出し前に関数内でこれを変更する最初のパラメータとして使用され、次のパラメータは実パラメータとして関数の仮パラメータに渡されます。
fn.call.call.call.call(fn,1,2,3); 前の原則と同じです。
一般的な概要:
よく理解していない場合は、次の一般的なヒントも覚えておいてください:
2 つ以上の呼び出しが発生した場合、最初のパラメーターが実行され、最初のパラメーターは関数である必要があります。 2 つのパラメーターは、最初のパラメーターでこれを変更するためのものです。
3 番目以降のパラメーターは、実際のパラメーターとして最初のパラメーターに渡されます。
以上がインタビューの質問: JavaScript の呼び出しメソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。