JavaScript上級者への道:call、apply、bindを使いこなしてコードをレベルアップ

2024-04-02

JavaScriptにおけるcallとapplyの違い

共通点

  • 関数を別のオブジェクトのコンテキストで呼び出す
  • thisキーワードの参照先を変更できる
  • 引数を個別に指定できる

相違点

項目callapply
引数の渡し方個別に指定配列で指定
引数の個数可変可変
パフォーマンスわずかに速いわずかに遅い

詳細

  • 引数の渡し方

    • callは、第二引数以降に個別に引数を指定します。
  • 引数の個数

  • パフォーマンス

function greeting(name) {
  console.log(`Hello, ${name}!`);
}

const person = {
  name: 'John Doe',
};

// call
greeting.call(person, 'Jane Doe'); // Hello, Jane Doe!

// apply
greeting.apply(person, ['Jane Doe']); // Hello, Jane Doe!

上記例では、greeting関数をpersonオブジェクトのコンテキストで呼び出しています。

使い分け

  • 引数を個別に指定したい場合はcall
  • パフォーマンスが重要な場合はcall

補足

  • bindというメソッドも、thisキーワードの参照先を変更するために使用できます。
  • callapplybindは、オブジェクト指向プログラミングの重要な概念です。



call

function greeting(name) {
  console.log(`Hello, ${name}!`);
}

const person = {
  name: 'John Doe',
};

// call
greeting.call(person, 'Jane Doe'); // Hello, Jane Doe!

// callを使って、オブジェクトのプロパティにアクセスする
function getFullName() {
  return `${this.firstName} ${this.lastName}`;
}

const user = {
  firstName: 'John',
  lastName: 'Doe',
};

const fullName = getFullName.call(user); // 'John Doe'

apply

function greeting(name) {
  console.log(`Hello, ${name}!`);
}

const person = {
  name: 'John Doe',
};

// apply
greeting.apply(person, ['Jane Doe']); // Hello, Jane Doe!

// applyを使って、配列の要素を個別に引数として渡す
function sumNumbers(a, b, c) {
  return a + b + c;
}

const numbers = [1, 2, 3];

const sum = sumNumbers.apply(null, numbers); // 6

bind

function greeting(name) {
  console.log(`Hello, ${name}!`);
}

const person = {
  name: 'John Doe',
};

// bind
const boundGreeting = greeting.bind(person);

boundGreeting('Jane Doe'); // Hello, Jane Doe!

// bindを使って、新しい関数を生成する
function add(a) {
  return this.b + a;
}

const obj = {
  b: 10,
};

const add10 = add.bind(obj);

const result = add10(5); // 15



JavaScriptで関数を別のオブジェクトのコンテキストで呼び出すその他の方法

アロー関数を使用すると、thisキーワードの参照先を明示的に指定する必要がなく、簡潔にコードを書くことができます。

const person = {
  name: 'John Doe',
};

const greeting = () => console.log(`Hello, ${this.name}!`);

greeting.call(person); // Hello, John Doe!

Proxyオブジェクトを使用すると、オブジェクトのプロパティやメソッドへのアクセスをインターセプトすることができます。

const person = {
  name: 'John Doe',
};

const proxy = new Proxy(person, {
  get(target, property) {
    if (property === 'greeting') {
      return function() {
        console.log(`Hello, ${this.name}!`);
      };
    }

    return target[property];
  },
});

proxy.greeting(); // Hello, John Doe!

Function.prototype.bindメソッドを使用すると、新しい関数を生成することができます。

function greeting(name) {
  console.log(`Hello, ${name}!`);
}

const person = {
  name: 'John Doe',
};

const boundGreeting = greeting.bind(person);

boundGreeting(); // Hello, John Doe!

これらの方法はそれぞれ異なる利点と欠点があるため、状況に応じて使い分ける必要があります。


javascript function performance


インライン onclick 属性でイベント伝播を停止する方法

イベント停止とは、イベント伝播を途中で止めることです。イベント伝播を止めることで、不要なイベントの処理を抑制したり、意図しない動作を防いだりすることができます。インライン onclick 属性を使用してイベント伝播を停止するには、return false;ステートメントを使用します。...


ページ遷移をスムーズに!JavaScript と jQuery によるリダイレクトテクニック

JavaScript でリダイレクトするには、以下のコードを使用します。上記のコードはすべて、https://www. example. com/ という URL にリダイレクトします。location. href と window. location...


JavaScript / jQuery / HTML で .css() を使って !important を適用する方法

.css() メソッドは、JavaScript または jQuery を使って、要素に動的にスタイルを適用することができます。このメソッドを使って !important を適用するには、以下の方法があります。この方法では、プロパティ名の後に !important を直接記述します。...


React Native の <Text> コンポーネントに改行を挿入する方法:徹底解説

テンプレートリテラルを用いる方法は、最も簡潔で分かりやすい方法です。 以下のコードのように、バッククォート () で囲んだ文字列の中に改行 (\n) を直接記述できます。\n を {} で囲む通常の文字列に \n を直接記述する代わりに、{} で囲んで記述する方法もあります。 以下のコードのように、改行したい箇所を {} で囲み、その中に \n を記述します。...


TypeScript で「window」や「document」が認識されないエラー: 原因と解決方法

TypeScript で開発中に、「window」や「document」などのグローバル変数が認識されないエラーが発生することがあります。このエラーは、TypeScript コンパイラがブラウザ環境のグローバル変数を認識できていないことを示しています。...