JavaScript の「call」と「apply」の違いを理解する

JavaScript

JavaScript の関数呼び出しメソッド

JavaScript では関数を呼び出す方法がいくつか提供されており、そのうちの 2 つは `Function.prototype.call()` と `Function.prototype.apply()` です。どちらのメソッドも、指定された「this」値と引数を使用して関数を呼び出す役割を果たしますが、これらの引数がどのように渡されるかが異なります。

この記事は、「call」と「apply」の違い、それらのパフォーマンスへの影響、および一方が他方よりも優先されるシナリオを探ることを目的としています。最終的には、JavaScript コードで「call」または「apply」をいつ使用するかをより明確に理解できるようになります。

JavaScript の「call」と「apply」の違いを調べる

JavaScript フロントエンドの例

// Example of Function.prototype.call()
const person = {
  fullName: function() {
    return this.firstName + " " + this.lastName;
  }
};

const person1 = {
  firstName: "John",
  lastName: "Doe"
};

console.log(person.fullName.call(person1)); // John Doe

JavaScript の「call」と「apply」のパフォーマンスを理解する

JavaScript フロントエンドの例

// Example of Function.prototype.apply()
const person = {
  fullName: function(city, country) {
    return this.firstName + " " + this.lastName + ", " + city + ", " + country;
  }
};

const person2 = {
  firstName: "Jane",
  lastName: "Doe"
};

console.log(person.fullName.apply(person2, ["Oslo", "Norway"])); // Jane Doe, Oslo, Norway

JavaScript での関数呼び出しの「call」と「apply」の比較

Node.js バックエンドの例

const person = {
  fullName: function(city, country) {
    return this.firstName + " " + this.lastName + ", " + city + ", " + country;
  }
};

const person3 = {
  firstName: "Alice",
  lastName: "Smith"
};

function printName(method) {
  if (method === 'call') {
    console.log(person.fullName.call(person3, 'Paris', 'France'));
  } else if (method === 'apply') {
    console.log(person.fullName.apply(person3, ['Paris', 'France']));
  }
}

printName('call');  // Alice Smith, Paris, France
printName('apply'); // Alice Smith, Paris, France

JavaScript 開発における「call」と「apply」の選択

JavaScript パフォーマンス分析

const iterations = 1000000;
const person = {
  fullName: function(city, country) {
    return this.firstName + " " + this.lastName + ", " + city + ", " + country;
  }
};
const person4 = {
  firstName: "Bob",
  lastName: "Brown"
};

console.time('call');
for (let i = 0; i < iterations; i++) {
  person.fullName.call(person4, 'Berlin', 'Germany');
}
console.timeEnd('call');

console.time('apply');
for (let i = 0; i < iterations; i++) {
  person.fullName.apply(person4, ['Berlin', 'Germany']);
}
console.timeEnd('apply');

JavaScript でのメソッドの呼び出しと適用についての深い洞察

基本的な使い方に加えて、 そして JavaScript プログラミングを強化できる高度な使用例がいくつかあります。そのような使用例の 1 つは、あるオブジェクトのメソッドが別のオブジェクトから借用されるメソッド借用です。これは、継承せずに別のオブジェクトのメソッドを使用する必要があるオブジェクトがある場合に特に便利です。使用する そして apply()を使用すると、メソッドを一時的に借用して、別のオブジェクトのコンテキストで実行できるため、コードの再利用性が向上し、冗長性が軽減されます。

考慮すべきもう 1 つの重要な側面は、 可変引数関数の場合 - 可変数の引数を受け入れる関数。引数の配列があり、それを配列を受け入れない関数に渡す必要がある場合、 非常に便利になります。一方で、 は、パフォーマンスが重要であり、引数の数が既知で固定されているシナリオで役立ちます。これらのニュアンスを理解することで、開発者はいつ使用するかについて、より多くの情報に基づいた決定を下すことができます。 call() 対 、読みやすさとパフォーマンスの両方のためにコードを最適化します。

  1. の主な違いは何ですか そして ?
  2. 引数を個別に受け入れますが、 引数を配列として受け取ります。
  3. できる そして 互換的に使用されますか?
  4. はい、同じ結果を得ることができますが、選択は引数の構造によって異なります。
  5. いつを優先すればよいですか 以上 ?
  6. 使用 引数の配列または可変数の引数がある場合。
  7. 性能に違いはありますか そして ?
  8. ほとんどの場合、パフォーマンスの差は無視できますが、 固定数の引数を使用すると、わずかに高速になる可能性があります。
  9. どうやって そして を処理する コンテクスト?
  10. どちらのメソッドも明示的に設定します。 関数呼び出しのコンテキスト。
  11. 使ってもいいですか そして コンストラクター関数で?
  12. いいえ、新しいインスタンスを作成しないため、コンストラクター関数には適していません。
  13. 高度な使用例にはどのようなものがありますか そして ?
  14. これらは、メソッドの借用や可変個引数関数の処理に役立ちます。
  15. どうやって コードの可読性を向上させるには?
  16. 引数の数がわかっていて固定されている場合、関数の呼び出しがより明確になります。
  17. できる 未知の数の引数を処理しますか?
  18. はい、 可変数の引数を処理する必要がある関数に最適です。

関数呼び出しメソッドに関する最終的な考え方

結論から言うと、どちらも そして メソッドは、指定された関数を呼び出すための JavaScript の強力なツールです。 価値。どちらを選択するかは、関数に引数をどのように渡すかによって大きく異なります。その間 call 固定数の引数を扱う場合に最適です。 配列または不明な数の引数を処理するときに点灯します。これらのニュアンスを理解することは、より効率的で読みやすいコードを作成するのに役立ち、最終的には JavaScript プログラミングの実践につながります。