カテゴリ: JavaScript 更新日: 2026/02/11

JavaScriptの関数の呼び出し方(call, apply, bindの違い)

JavaScriptの関数の呼び出し方(call, apply, bindの違い)
JavaScriptの関数の呼び出し方(call, apply, bindの違い)

先生と生徒の会話形式で理解しよう

生徒

「先生、JavaScriptの関数にある callapplybind って何ですか?どう違うんですか?」

先生

「それは関数を呼び出す時の特別な方法で、関数の中で使われる this の値を自由に変えられる便利な機能です。」

生徒

thisって何ですか?」

先生

thisは関数の中で、その関数が『誰のものか』を指す特別なキーワードです。普通は関数を呼んだオブジェクト(もの)を指しますが、callapplyで変えられますよ。」

生徒

「具体的にどう使うんですか?わかりやすい例を教えてください!」

先生

「それでは、基本の使い方と違いを詳しく見ていきましょう!」

1. call, apply, bindとは?

1. call, apply, bindとは?
1. call, apply, bindとは?

JavaScriptの関数は普通、obj.func() のようにオブジェクトの一部として呼び出されることが多いです。このとき、関数の中の this はそのオブジェクト obj を指します。

でも、callapplybind を使うと、この this を好きなオブジェクトに変えて関数を呼べます。

これらの違いをかんたんにまとめると:

  • call:関数を呼び出しながら、thisと引数を個別に渡す
  • apply:関数を呼び出しながら、thisと引数を配列で渡す
  • bindthisを固定した新しい関数を作る(あとで呼び出す)

2. this(ディス)とは?

2. this(ディス)とは?
2. this(ディス)とは?

thisは「今の関数がどのオブジェクトに属しているか」を示す特別なキーワードです。

例えば、猫のオブジェクト cat に「鳴く」関数があったら、その関数の thiscat を指します。


const cat = {
  name: "タマ",
  meow: function() {
    console.log(this.name + "がニャーと鳴きました");
  }
};

cat.meow();  // タマがニャーと鳴きました

この this.namecat.name のことですね。

3. callの使い方

3. callの使い方
3. callの使い方

callは関数を「今すぐ呼び出し」、thisの中身と引数を個別に指定します。


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

const person = { name: "太郎" };

greet.call(person, "こんにちは");  // こんにちは, 太郎

ここでは、greet関数の中のthispersonに変えて呼んでいます。

引数は「こんにちは」という文字列を渡しています。

4. applyの使い方

4. applyの使い方
4. applyの使い方

applycallと似ていますが、引数は配列(リスト)で渡します。


greet.apply(person, ["おはようございます"]);  // おはようございます, 太郎

引数が複数ある場合に便利です。例えば:


function introduce(age, city) {
  console.log(this.name + "さんは、" + age + "歳で、" + city + "に住んでいます。");
}

introduce.apply(person, [30, "東京"]);
// 太郎さんは、30歳で、東京に住んでいます。

5. bindの使い方

5. bindの使い方
5. bindの使い方

bindthisを固定した新しい関数を作ります。呼び出しはあとで行います。


const boundGreet = greet.bind(person);
boundGreet("こんばんは");  // こんばんは, 太郎

このように、bindはすぐ実行せず、thisを決めた関数を作るので、イベントや後で呼ぶ処理に使いやすいです。

6. call, apply, bindの違いまとめ

6. call, apply, bindの違いまとめ
6. call, apply, bindの違いまとめ
  • call:すぐ呼び出して、thisと引数を個別に渡す
  • apply:すぐ呼び出して、thisと引数を配列で渡す
  • bindthisを固定した新しい関数を作り、あとで呼ぶ

7. まとめ

7. まとめ
7. まとめ

JavaScriptの関数呼び出しに使う callapplybind は、this の値を自由に操作できる便利な方法です。

使い方を理解すると、関数の中で「どのオブジェクトのことを話しているか」を自在に切り替えられて、複雑なコードも整理しやすくなります。

ぜひ実際に試して使いこなしてくださいね!

まとめ

まとめ
まとめ

ここまでJavaScriptにおける関数の高度な呼び出し方であるcallapplybindについて詳しく解説してきました。これらはJavaScriptの柔軟性を象徴する機能であり、大規模なアプリケーション開発やライブラリの内部実装などでも頻繁に目にする重要な概念です。

なぜこれらのメソッドが必要なのか

JavaScriptを学び始めたばかりの頃は、「なぜわざわざthisを書き換える必要があるのか?」と疑問に思うかもしれません。しかし、プログラムが複雑になり、コードの再利用性を高めようとすると、特定のオブジェクトに縛られずに関数を定義し、実行時に状況に応じて「誰のデータを使うか」を切り替えたい場面が出てきます。

例えば、異なる構造を持つ複数のオブジェクトに対して、共通の計算ロジックを適用したい場合などが挙げられます。継承(クラス)を使わなくても、これらのメソッドを活用することで、既存のオブジェクトに関数を「借りてくる」ような使い方が可能になるのです。

実践的なサンプルプログラム:データの使い回し

具体的なイメージを深めるために、異なる動物のステータスを表示する例を考えてみましょう。通常はそれぞれのオブジェクトにメソッドを持たせますが、ここでは一つの共通関数を使い回すコードを作成します。


// 共通で使いたい関数
function showStatus(action, food) {
    console.log(`${this.type}の${this.nickname}は、${action}をしてから${food}を食べました。`);
}

// データを持つオブジェクト1
const dog = {
    type: "イヌ",
    nickname: "ポチ"
};

// データを持つオブジェクト2
const bird = {
    type: "小鳥",
    nickname: "ピーちゃん"
};

// 1. callを使って個別に引数を渡す
showStatus.call(dog, "お散歩", "ドッグフード");

// 2. applyを使って配列で引数を渡す
const params = ["空の散歩", "ひまわりの種"];
showStatus.apply(bird, params);

// 3. bindを使って特定のオブジェクト専用の関数を作る
const dogStatus = showStatus.bind(dog);
dogStatus("お昼寝", "おやつ");

上記のコードを実行すると、コンソールには次のように出力されます。


イヌのポチは、お散歩をしてからドッグフードを食べました。
小鳥のピーちゃんは、空の散歩をしてからひまわりの種を食べました。
イヌのポチは、お昼寝をしてからおやつを食べました。

さらに深く知るためのポイント

これら三つのメソッドを使い分ける際のヒントをいくつか紹介します。

  • callの使い所: 引数の数が決まっていて、固定の値を渡したいときに最もシンプルで読みやすい記述になります。
  • applyの使い所: ユーザーの入力やAPIのレスポンスなど、引数のリストが動的な配列として存在する場合に非常に強力です。Math.max.apply(null, numbers)のように、配列内の最大値を求める際などのテクニックとしても有名です。
  • bindの使い所: 非同期処理やイベントリスナーで特に活躍します。例えば、ボタンをクリックした時に実行される関数内でthisが意図せず「ボタン要素そのもの」を指してしまうのを防ぎ、元のクラスやオブジェクトを指し続けたいときに必須となります。

注意点とモダンな書き方

最近のJavaScript(ES6以降)では、applyの代わりに「スプレッド構文(...)」を使うことも増えています。例えば func.apply(obj, [1, 2])func.call(obj, ...[1, 2]) と書くことができます。しかし、thisの束縛(バインド)そのものを行う機能は依然としてこれら三つのメソッドが唯一無二の役割を担っています。

また、アロー関数(() => {})は定義された瞬間にthisが固定されるという特性を持っているため、callbindを使ってもthisを書き換えることができません。アロー関数と通常の関数(functionキーワード)を使い分ける際には、この挙動の違いにも注意しましょう。

先生と生徒の振り返り会話

生徒

「なるほど!callapplybindの違いがかなりハッキリしてきました。 基本的にはどれもthisを操るための道具なんですね。でも、最初はやっぱりbindが一番難しそうに感じます。」

先生

「鋭いですね。callapplyはその場で実行されるので直感的に分かりやすいですが、bindは『分身を作る』ようなイメージですから、少し独特です。 例えば、タイマー処理のsetTimeoutの中でオブジェクトのメソッドを使おうとすると、thisが迷子になってエラーになることがよくありますが、そこでbindが救世主になるんですよ。」

生徒

「あ、それで『後で実行する』という説明があったんですね!イベントが発生した時とかに、正しい主語(オブジェクト)を教えておくために予約しておく感じですか?」

先生

「その通り!まさに『予約』という表現がぴったりです。 それから、applyについても補足しておくと、昔のJavaScriptでは配列を引数にバラして渡す唯一の方法だったのでよく使われていました。今はスプレッド構文もありますが、古いコードを読むときには必ず出てくるので、仕組みを知っておくのはとても大切です。」

生徒

「配列のまま渡せるのは便利ですね。わざわざインデックスを指定してバラバラに書かなくて済むから、コードがスッキリしそうです。 今回の学習で、関数の裏側にあるthisの動きが少し怖くなくなりました!」

先生

「それは良かったです!thisを自由にコントロールできるレベルになると、中級エンジニアへの階段を一つ登ったと言えますよ。 プログラムを書くときは、常に『今、この関数のthisは誰を指しているんだろう?』と意識する癖をつけてみてくださいね。」

カテゴリの一覧へ
新着記事
New1
TypeScript
TypeScriptでパスエイリアスを設定する方法!baseUrlとpathsでコードをスッキリ整理
New2
JavaScript
JavaScriptのfor文の書き方を初心者向けにやさしく解説
New3
JavaScript
JavaScriptの関数でよくあるエラーとその解決法まとめ
New4
JavaScript
JavaScriptのイベント処理でよくあるエラーとその対処法
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptのマウスイベントの使い方(click, mouseoverなど)
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptのtoStringとString関数の違いを初心者向けに解説
No.4
Java&Spring記事人気No4
JavaScript
JavaScriptの純粋関数(pure function)と副作用の違いを理解しよう
No.5
Java&Spring記事人気No5
JavaScript
JavaScriptプログラムの実行方法まとめ!ブラウザ・Node.js・コンソールの使い方
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptで文字列をforループで1文字ずつ処理する方法!初心者向け解説
No.7
Java&Spring記事人気No7
TypeScript
TypeScript学習におすすめの無料教材・リファレンスサイト【初心者向け】
No.8
Java&Spring記事人気No8
JavaScript
JavaScriptのDOMContentLoadedとloadイベントの違いを理解しよう