まず MDN での呼び出しの説明を見てみましょう
call() メソッドは、指定された this 値と指定されたいくつかのパラメーター値を使用して関数またはメソッドを呼び出します。
注: このメソッドの機能は apply() メソッドに似ています。唯一の違いは、call() メソッドが複数のパラメーターのリストを受け入れるのに対し、apply() メソッドは複数のパラメーターを含む配列を受け入れることです。
文法
fun.call(thisArg[, arg1[, arg2[, ...]]])
パラメータ
thisArg
fun 関数の実行時に指定された this の値。関数の実行時に、指定された this 値が必ずしも実際の this 値であるとは限らないことに注意してください。関数が非厳密モードの場合、null および未定義として指定された this 値は自動的にグローバル オブジェクトを指します (ブラウザの場合はウィンドウ オブジェクトです)、値がプリミティブ値 (数値、文字列、ブール値) である this は、プリミティブ値の自動ラッピング オブジェクトを指します。
引数1、引数2、...
指定されたパラメータのリスト。
MDN の例は最初は理解するのが簡単ではなかったので、ここに投稿しました。興味がある場合は、call-JavaScript を自分で確認してください。
ここでの thisArg は、fun の実行時に指定された this 値として解釈されます。つまり、call を使用した後、fun の this は thisArg? を指します。コードを見てください
var p="456"; function f1(){ this.p="123"; } function f2() { console.log(this.p); } f2(); //456 f2.call(f1()); //123 f2.apply(f1()); //123
最初の出力は呼び出しのグローバル変数です。その後、call と apply を使用するため、f2 の this は f1 を指すため、出力は 123 になります。実際、f1 は f2 のメソッドを借用し、そのメソッドを出力します。自分のp
このとき、f1() 内の this.p を削除すると、456 が 3 つ出力されます。これは、this が null または未定義の場合、実際にグローバル変数
を指していることを確認します。元の値を指すことに関して、それはそのパッケージ化オブジェクトを指します。私が理解しているパッケージ化オブジェクトは一時的なものであり、テストではオブジェクトではなく元の値の型のみが出力されるため、ここでそれを証明するにはどうすればよいでしょうか。知っている人はいますか、私と話し合っていただければ幸いです、ありがとう!
呼び出しは、あるオブジェクトが別のオブジェクトを借用することを実現できるので、継承も実現できないのでしょうか?コードを見てください
function f1(){ this.father="father" } function f2() { f1.call(this); this.child="child"; } var test=new f2(); console.log(test.father); //father
f2() の
のため、テストには父親がありません。f1.call(this);
ここでは f2 を指します。これは、f2 が f1 のメソッドを借用し、実際に継承を実現することを意味します
ここでパラメータについて話しましょう。ここでのパラメータは fun に渡されます。
function f1(){ this.p="123"; } function f2(x) { console.log(this.p); console.log(x); } f2.call(f1(),456); //123 //456
最初の出力は f1 の p により 123 で、次の 456 は f2 に渡されるパラメータです。
主なことは、呼び出しと適用のパラメータの違いに注意することです
call は 1 つずつ渡され、apply は配列で渡されます
function f1(){ this.p="测试call"; } function f2(x,y,z) { console.log(this.p); console.log(x); console.log(y); console.log(z); } function f3(){ this.p="测试apply"; } f2.call(f1(),4,5,6); f2.call(f1(),[4,5,6]); f2.apply(f3(),[4,5,6]); f2.apply(f3(),4,5,6);
結果はここでご覧いただけます
最初のテスト呼び出しは正しく出力されます
2 番目のテスト呼び出しは配列で渡されるため、最初に配列を出力し、次に 2 つの未定義を出力します
テスト適用の 3 番目のセクションは正しく出力されます
4 番目の段落は、パラメータ形式が正しくないためエラーを直接報告しています
ここでの違いは明らかです