JavaScriptの「this」はJavaと何が違うのか?―新人エンジニアのためのやさしい比較解説
こんにちは。ゆうせいです。
JavaScriptの勉強をしていると、こんな場面でつまずきませんか?
console.log(this);
「え、this って自分自身のことじゃないの?」「クラスの中じゃないのに使えるの?」「Javaと動きが違いすぎて混乱する…!」
そんなあなたのために、今回は「JavaScriptの this」と「Javaの this」を、比較しながらわかりやすく解説していきます。
そもそも「this」とは?
まずは共通点からスタートしましょう。
「this」とは、自分自身(のオブジェクト)を指すキーワード
これはJavaでもJavaScriptでも共通の概念です。ただし、「自分自身」とは何か?その決まり方に違いがあるのです。
Javaのthis:常に「そのクラスのインスタンス」
例:Javaのクラスとthis
public class Person {
String name;
public Person(String name) {
this.name = name;
}
public void greet() {
System.out.println("こんにちは、私は " + this.name + " です");
}
}
Javaの特徴:
- 常にそのクラスのインスタンスを指す
- コンテキスト(状況)にかかわらず固定
- メソッドの中でしか使えない
つまり、Javaのthisはブレないんです!
JavaScriptのthis:呼び出し方によって変わる!
一方、JavaScriptはどうでしょう?
const person = {
name: '太郎',
greet: function () {
console.log('こんにちは、私は ' + this.name + ' です');
}
};
person.greet(); // → "こんにちは、私は 太郎 です"
このときの this は person オブジェクト を指しています。
でも次のようにすると…?
const greetFunc = person.greet;
greetFunc(); // → "こんにちは、私は undefined です"
「えっ!同じ関数なのに、thisが変わった!?」
そうなんです。JavaScriptの this は「関数がどう呼び出されたか」によって指すものが変わります。
両者の比較表
| 項目 | Javaのthis | JavaScriptのthis |
|---|---|---|
| 指す対象 | 常にクラスのインスタンス | 呼び出し方によって変わる |
| 安定性 | 常に固定 | 実行時に動的に決まる |
| 使える場所 | クラス内のメソッド | グローバル、関数、オブジェクト内など様々 |
| メソッドの外での意味 | 無効(使えない) | グローバルオブジェクトを指すことがある(厳密モードでは undefined) |
JavaScriptのthisが変わるパターン
1. 通常の関数呼び出し
function showThis() {
console.log(this);
}
showThis(); // → window(または global)
2. オブジェクトのメソッドとして呼び出す
const obj = {
name: '花子',
show: function () {
console.log(this.name);
}
};
obj.show(); // → "花子"
3. イベントリスナー内のthis
const button = document.querySelector('button');
button.addEventListener('click', function () {
console.log(this); // → クリックされたbutton要素
});
4. アロー関数のthis(特別ルール)
const obj = {
name: '一郎',
show: () => {
console.log(this.name);
}
};
obj.show(); // → undefined(thisは親スコープを継承する)
アロー関数ではthisは「外側のthis」をそのまま使うという仕様があります。これがまたややこしい!
図でイメージする:JavaとJavaScriptのthis
[Javaの場合]
class Foo {
this → Fooのインスタンス
}
[JavaScriptの場合]
this
↓ 呼び出し方で変化
- グローバルから呼べば → window
- オブジェクトから呼べば → そのオブジェクト
- アロー関数なら → 親のthisを参照
まとめ:JavaとJavaScriptでthisは全然ちがう!
| ポイント | Java | JavaScript |
|---|---|---|
| ブレない | ◎ | ×(呼び方次第で変化) |
| 明快さ | ◎ | △(慣れが必要) |
| 安心感 | ◎ | △(アロー関数・イベントで混乱) |
今後の学習のヒント
this の理解を深めるために、次のテーマもおすすめです!
- bind(), call(), apply() の違い:
thisを手動で指定するテクニック - アロー関数と普通の関数の違い
- JavaScriptのスコープとクロージャ
- class構文と
thisの扱い(ES6以降)
「Javaと似ているはず」と思っていると、逆に混乱しやすいのが this。
でも、仕組みを一度つかんでしまえば「なぜこうなるのか?」がすっきり理解できますよ!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
山崎講師2025年11月23日未経験でも迷わない!「成果が出る」新入社員研修の企画・講師スキル・評価まで徹底解説
山崎講師2025年11月23日新人クリエイターのための「生成AIと著作権」完全ガイド
山崎講師2025年11月23日【超入門】Hugging Faceで始めるAI開発!新人エンジニアが最初に触るべきTransformerの基礎と実践
山崎講師2025年11月23日新人エンジニア必見!才能よりも大切な「やり抜く力(グリット)」の鍛え方とは?