カテゴリ: JavaScript 更新日: 2026/08/23

JavaScriptのbind・call・applyでthisを明示的に設定する方法を徹底解説 初心者向け完全ガイド

JavaScriptのbind()・call()・apply()でthisを明示的に設定する方法
JavaScriptのbind()・call()・apply()でthisを明示的に設定する方法

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

生徒

「JavaScriptでthisってよく聞くんですけど、何を指しているんですか?」

先生

「JavaScriptのthisは、今どのオブジェクトを使っているかを表す特別なキーワードです。状況によって指す相手が変わるのが特徴です。」

生徒

「状況で変わると混乱しそうです。自分で決めることはできないんですか?」

先生

「できます。bindやcallやapplyというメソッドを使うと、thisを明示的に設定できます。今日はその使い方をわかりやすく学びましょう。」

1. JavaScriptのthisとは何か 基本をやさしく理解しよう

1. JavaScriptのthisとは何か 基本をやさしく理解しよう
1. JavaScriptのthisとは何か 基本をやさしく理解しよう

JavaScriptのthisは、今どのオブジェクトの中で処理が行われているかを示すキーワードです。オブジェクトとは、データと処理をひとまとめにした箱のようなものです。たとえば名前や年齢などの情報を持つ人のデータもオブジェクトです。

しかしJavaScriptのthisは、書き方によって指す相手が変わります。そのため初心者がつまずきやすいポイントです。そこで重要になるのが、bind、call、applyという三つのメソッドです。これらを使えば、thisを自分で指定できます。

2. callでthisを明示的に設定する方法

2. callでthisを明示的に設定する方法
2. callでthisを明示的に設定する方法

callは、関数を実行するときにthisを指定できるメソッドです。書き方は、関数名.call 設定したいオブジェクト 引数 という形になります。


function greet() {
  console.log("こんにちは、" + this.name + "さん");
}

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

greet.call(user);

実行結果は次のようになります。


こんにちは、太郎さん

この例では、greetの中のthisをuserに設定しています。つまりthis.nameはuser.nameを指します。callは引数を一つずつ並べて渡すのが特徴です。

3. applyでthisを明示的に設定する方法

3. applyでthisを明示的に設定する方法
3. applyでthisを明示的に設定する方法

applyもcallと同じようにthisを指定できます。違いは引数の渡し方です。applyでは、引数を配列という形でまとめて渡します。配列とは、複数の値を順番に並べて入れる箱のようなものです。


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

const person = { name: "花子" };

introduce.apply(person, [25, "大阪"]);

実行結果です。


花子は25歳で大阪に住んでいます

callとapplyは似ていますが、引数が多いときはapplyのほうが便利な場合があります。JavaScriptのthisを明示的に制御したいときに重要な知識です。

4. bindでthisを固定する方法

4. bindでthisを固定する方法
4. bindでthisを固定する方法

bindは少し特別です。callやapplyはその場で関数を実行しますが、bindは新しい関数を作ります。そしてその新しい関数のthisを固定します。


function sayMessage() {
  console.log("私は" + this.name + "です");
}

const member = { name: "次郎" };

const boundFunction = sayMessage.bind(member);

boundFunction();

実行結果です。


私は次郎です

bindは、あとから何度も使いたいときに便利です。イベント処理やタイマー処理など、thisが変わりやすい場面でよく使われます。

5. スコープとthisの違いを理解する

5. スコープとthisの違いを理解する
5. スコープとthisの違いを理解する

スコープとは、変数が使える範囲のことです。一方でthisは、どのオブジェクトを参照しているかを示します。この二つはまったく別の概念です。

たとえば関数の中で定義した変数は外から使えません。これがスコープです。しかしthisは呼び出し方で変わります。JavaScriptのthisとスコープを混同しないことが重要です。


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

obj.show();

この場合、thisはobjを指します。呼び出し方が変わればthisも変わります。

6. よくある間違いと対策

6. よくある間違いと対策
6. よくある間違いと対策

初心者がよく間違えるのは、関数を変数に代入して実行したときです。その場合thisが意図しない値になります。


const car = {
  brand: "トヨタ",
  showBrand: function() {
    console.log(this.brand);
  }
};

const fn = car.showBrand;
fn();

この場合、thisはcarを指しません。そこでbindを使います。


const fixedFn = car.showBrand.bind(car);
fixedFn();

このようにbindを使えば、JavaScriptのthisを確実に固定できます。JavaScriptのbind、call、applyは、thisの動きを正しく理解するための重要なメソッドです。JavaScript初心者にとって難しく感じますが、仕組みを知れば決して怖くありません。何度も実際にコードを書いて、JavaScriptのthisの動きを体験することが理解への近道です。

まとめ

まとめ
まとめ

ここまで、JavaScriptのbind、call、applyを使ってthisを明示的に設定する方法を詳しく学んできました。JavaScriptのthisは、関数の呼び出し方によって参照先が変わるという大きな特徴があります。この仕様こそが、JavaScript初心者にとって混乱しやすい最大のポイントです。しかし、仕組みを一つずつ整理して理解すれば、決して難しいものではありません。

まずcallは、関数を実行すると同時にthisを指定できるメソッドです。関数名.call オブジェクト 引数という形で書き、引数は順番に並べて渡します。JavaScriptでthisをその場で切り替えたいときに非常に便利です。オブジェクト指向の考え方と組み合わせることで、既存の関数を別のオブジェクトに使い回すことも可能になります。

次にapplyは、callとほぼ同じ役割を持っていますが、引数を配列としてまとめて渡す点が異なります。引数が動的に増減する場合や、配列データをそのまま渡したい場合に特に役立ちます。JavaScriptの配列操作と組み合わせることで、柔軟な関数設計が可能になります。

そしてbindは、thisを固定した新しい関数を作るメソッドです。callやapplyと違い、その場で実行するのではなく、後から使える関数を生成します。イベント処理やタイマー処理、コールバック関数など、thisが意図せず変わってしまう場面で大活躍します。JavaScript開発において、bindは非常に実践的で重要な知識です。

また、スコープとthisはまったく別の概念であることも重要なポイントでした。スコープは変数の有効範囲を表し、thisはどのオブジェクトを参照しているかを示します。この違いを正しく理解することで、JavaScriptの関数設計やオブジェクト設計がより明確になります。

JavaScriptのthisを自在に扱えるようになると、オブジェクト指向プログラミングの理解が一段と深まります。クラス構文を使う場合でも、内部ではthisの仕組みが動いています。つまり、bind、call、applyの理解は、モダンJavaScriptを学ぶうえでの土台と言えます。

総復習サンプルプログラム

最後に、bind、call、applyをまとめて確認できるサンプルプログラムを見てみましょう。JavaScriptのthisの動きに注目しながら読み進めてください。


function profile(age, job) {
  console.log("名前は" + this.name + "で年齢は" + age + "歳、職業は" + job + "です");
}

const userA = { name: "一郎" };
const userB = { name: "美咲" };

profile.call(userA, 30, "エンジニア");
profile.apply(userB, [28, "デザイナー"]);

const boundProfile = profile.bind(userA);
boundProfile(35, "講師");

実行結果は次の通りです。


名前は一郎で年齢は30歳、職業はエンジニアです
名前は美咲で年齢は28歳、職業はデザイナーです
名前は一郎で年齢は35歳、職業は講師です

このように、同じ関数でもcall、apply、bindを使い分けることで、thisを自由にコントロールできます。JavaScriptのthisを正しく理解することは、バグの少ないコードを書くためにも重要です。特に関数の使い回しや再利用性を高めたい場合、bindやcallやapplyの知識は欠かせません。

JavaScript初心者の方は、まずは小さなサンプルコードを何度も書き、thisの挙動を体験してください。コンソールに出力しながら確認することで、頭だけでなく体で理解できます。JavaScriptのthisは決して曖昧な存在ではなく、ルールに従って動いています。そのルールを知ることが、確実なスキル向上につながります。

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

生徒

今日はJavaScriptのbindやcallやapplyを学んで、thisを自分で決められることがわかりました。今まではthisが勝手に変わる怖い存在だと思っていました。

先生

とても良い気づきですね。JavaScriptのthisは呼び出し方で決まります。だからこそ、bindやcallやapplyを使えば明示的に制御できます。

生徒

callはその場で実行して引数を順番に渡す、applyは配列で渡す、bindは新しい関数を作ってthisを固定するという違いが理解できました。

先生

素晴らしいまとめです。さらにスコープとthisの違いも大切でしたね。スコープは変数の範囲、thisは参照するオブジェクトです。

生徒

これからはJavaScriptの関数を書くときに、thisが何を指すのかを意識します。イベント処理でもbindを活用してみます。

先生

その意識があれば大丈夫です。JavaScriptのthisを理解できれば、オブジェクト指向やクラス構文の理解も一気に進みます。これからも実際にコードを書きながら学習を続けていきましょう。

カテゴリの一覧へ
新着記事
New1
JavaScript
JavaScriptのwindow.onloadの使い方と注意点を初心者向けに解説
New2
JavaScript
JavaScriptの条件式でよくあるエラーとその対処法まとめ
New3
TypeScript
TypeScriptの型安全なオブジェクト設計をインターフェースで実現するコツ
New4
Claude Code
Claude Codeでバグの再現手順をまとめるプロンプト例
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptの比較演算子(==, ===, !=, !==)の違いを初心者向けにわかりやすく解説
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptプログラムの実行方法まとめ!ブラウザ・Node.js・コンソールの使い方
No.4
Java&Spring記事人気No4
JavaScript
JavaScriptの配列の一部を切り出す(slice, spliceの使い方)
No.5
Java&Spring記事人気No5
JavaScript
JavaScriptのReact入門!最初のコンポーネントを作ろう
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptの配列の要素にアクセスする方法(インデックス番号の使い方)
No.7
Java&Spring記事人気No7
TypeScript
TypeScriptの始め方:開発環境の構築手順【初心者向け】
No.8
Java&Spring記事人気No8
JavaScript
JavaScriptで要素の表示・非表示を切り替える方法(display・visibility)を完全解説