JavaScript 逆引き集 | call/apply/bind

JavaScript JavaScript
スポンサーリンク

call / apply / bind の基本 — fn.call(ctx, arg1) / fn.apply(ctx, [args]) / fn.bind(ctx)

JavaScript では 関数の呼び出し時に this を指定するための便利なメソッドが用意されています。
初心者が混乱しやすいポイントですが、仕組みを理解すると「関数をどのオブジェクトのメソッドとして動かすか」を自由にコントロールできます。


基本の違い

メソッド役割引数の渡し方戻り値
call関数を即実行個別に渡す (arg1, arg2)関数の戻り値
apply関数を即実行配列で渡す ([arg1, arg2])関数の戻り値
bind新しい関数を作る個別に渡すthis が固定された関数

基本のコード例

function greet(msg) {
  console.log(msg + " " + this.name);
}

const person = { name: "Aki" };

// call: 引数を個別に渡す
greet.call(person, "こんにちは"); // → "こんにちは Aki"

// apply: 引数を配列で渡す
greet.apply(person, ["やっほー"]); // → "やっほー Aki"

// bind: 新しい関数を作る
const bound = greet.bind(person);
bound("Hello"); // → "Hello Aki"
JavaScript

よく使うテンプレート集

配列操作に使う(apply)

const numbers = [5, 8, 2];
const max = Math.max.apply(null, numbers);
console.log(max); // 8
JavaScript

イベントハンドラで this を固定(bind)

const obj = {
  name: "Mika",
  show() {
    console.log(this.name);
  }
};

const btn = document.getElementById("btn");
btn.addEventListener("click", obj.show.bind(obj));
// → ボタンを押すと "Mika" が表示される
JavaScript

複数引数を渡す(call)

function sum(a, b) {
  console.log(this.prefix, a + b);
}

const ctx = { prefix: "結果:" };
sum.call(ctx, 3, 4); // → "結果: 7"
JavaScript

例題: クラス風の利用

function Person(name) {
  this.name = name;
}

function sayHello() {
  console.log("Hello, " + this.name);
}

const p1 = new Person("Aki");
const p2 = new Person("Mika");

// p1 のコンテキストで sayHello を実行
sayHello.call(p1); // "Hello, Aki"
sayHello.call(p2); // "Hello, Mika"
JavaScript
  • 効果: 同じ関数でも this を変えることで違うオブジェクトに対応できる。

実務でのコツ

  • call/apply: 即実行したいときに使う。
  • apply: 引数が配列で渡ってくるときに便利。
  • bind: コールバックやイベントで this が変わってしまうのを防ぐ。
  • アロー関数との違い: アロー関数は this を固定するので、bind と似た効果を持つ。

ありがちなハマりポイントと対策

  • this が意図しない値になる:
    • イベントや非同期処理で this が変わる。
    • 対策: bind やアロー関数で固定。
  • apply と call の違いが混乱:
    • call → 引数を個別に渡す。
    • apply → 引数を配列で渡す。

練習問題(配列の最大値を求める)

const arr = [10, 20, 5, 8];
const max = Math.max.apply(null, arr);
console.log("最大値:", max); // → 20
JavaScript
  • 効果: apply を使って配列を展開し、最大値を求められる。

直感的な指針

  • call = 即実行(引数は個別)
  • apply = 即実行(引数は配列)
  • bind = 新しい関数を作ってあとで実行
  • 「this を自由に切り替える」ための道具

これを覚えれば「イベントで this を固定」「配列を関数に渡す」「オブジェクトごとに関数を使い回す」といった場面で自在に活用できます。

タイトルとURLをコピーしました