JavaScriptのbind・call・applyでthisを明示的に設定する方法を徹底解説 初心者向け完全ガイド
生徒
「JavaScriptでthisってよく聞くんですけど、何を指しているんですか?」
先生
「JavaScriptのthisは、今どのオブジェクトを使っているかを表す特別なキーワードです。状況によって指す相手が変わるのが特徴です。」
生徒
「状況で変わると混乱しそうです。自分で決めることはできないんですか?」
先生
「できます。bindやcallやapplyというメソッドを使うと、thisを明示的に設定できます。今日はその使い方をわかりやすく学びましょう。」
1. JavaScriptのthisとは何か 基本をやさしく理解しよう
JavaScriptのthisは、今どのオブジェクトの中で処理が行われているかを示すキーワードです。オブジェクトとは、データと処理をひとまとめにした箱のようなものです。たとえば名前や年齢などの情報を持つ人のデータもオブジェクトです。
しかしJavaScriptのthisは、書き方によって指す相手が変わります。そのため初心者がつまずきやすいポイントです。そこで重要になるのが、bind、call、applyという三つのメソッドです。これらを使えば、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を明示的に設定する方法
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を固定する方法
bindは少し特別です。callやapplyはその場で関数を実行しますが、bindは新しい関数を作ります。そしてその新しい関数のthisを固定します。
function sayMessage() {
console.log("私は" + this.name + "です");
}
const member = { name: "次郎" };
const boundFunction = sayMessage.bind(member);
boundFunction();
実行結果です。
私は次郎です
bindは、あとから何度も使いたいときに便利です。イベント処理やタイマー処理など、thisが変わりやすい場面でよく使われます。
5. スコープとthisの違いを理解する
スコープとは、変数が使える範囲のことです。一方でthisは、どのオブジェクトを参照しているかを示します。この二つはまったく別の概念です。
たとえば関数の中で定義した変数は外から使えません。これがスコープです。しかしthisは呼び出し方で変わります。JavaScriptのthisとスコープを混同しないことが重要です。
const obj = {
name: "健一",
show: function() {
console.log(this.name);
}
};
obj.show();
この場合、thisはobjを指します。呼び出し方が変わればthisも変わります。
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を理解できれば、オブジェクト指向やクラス構文の理解も一気に進みます。これからも実際にコードを書きながら学習を続けていきましょう。