JavaScriptの「let _this = this;」って何?今でも使うの?
更新日:2025/04/15
JavaScriptの改修でコードの中でこんなの見かけて「???」ってなりました。
let _this = this;いや、なんで自分を変数に?_thisってなに?って思ったのがきっかけで調べたら、これは JavaScript の 「this」迷子問題に関係してる古いけど重要なテクニックだったんです。
thisが関数の呼び出し方によって値が変わるため(特にコールバック関数ではイベントが発生した要素)クラスのインスタンスの参照を保持できません
💡 そこで
let _this = this; は、ES5時代の this の扱いを補うための回避テクニックです。
現代(ES6以降)ではアロー関数 (=>) を使えば、もっとスマートに解決できます!
🕰️ なぜ _this を使ってたの?
ES5(2009年ごろ)までは、関数の中で this の参照が簡単に変わってしまうのが普通でした。
特に jQuery でイベントを使うとき、よくハマってました…(体験談)
this が変わっちゃう問題
class Example {
constructor() {
this.name = "MountEngineer";
}
hello() {
let _this = this;
$(".btn").on("click", function () {
console.log(_this.name); // → "MountEngineer"
console.log(this.name); // → undefined
});
}
}
この function() の中の this は、Exampleインスタンスじゃなくてクリックされたボタン要素を指します。
なので、元の this(=Exampleのインスタンス)を _this に保存しておいて、
function の中で使えるようにする、っていう涙ぐましい努力が必要だったわけです…。
🤖 今はこう書く!アロー関数で解決✨
ES6(2015年)以降なら、=>(アロー関数)を使ってこの問題をシンプルに解決できます!
class Example {
constructor() {
this.name = "MountEngineer";
}
hello() {
$(".btn").on("click", () => {
console.log(this.name); // → "MountEngineer"
});
}
}
アロー関数は「自分の this を持たない」ので、外側の this をそのまま使えるんです。これがめちゃくちゃ便利!
アロー関数と通常関数の比較表
| 項目 | 通常の関数 | アロー関数 |
|---|---|---|
| 構文 | function() { ... } | () => { ... } |
thisの参照 | 呼び出し時に決定(動的) | 定義時のスコープから継承(静的) |
| 使用例 | function() { _this.method(); } | () => { this.method(); } |
| 変数保存 | let _this = this; が必要 | 不要 |
| メリット | 柔軟なコンテキスト変更が可能 | コードが簡潔に書ける this参照エラーが起きにくい |
| 適した場面 | メソッドとして定義する場合<br>thisを動的に変えたい場合 | コールバック関数<br>イベントハンドラ<br>setTimeout内の関数 |
🧠 専門用語ざっくり解説
| 用語 | 説明 |
|---|---|
| this | 関数の実行コンテキスト(状況)によって意味が変わる魔物。 |
| スコープ | 変数や関数が使える「範囲」のこと。 |
| クロージャ | 外側の関数の変数を、内側の関数が覚えてる状態。 |
| アロー関数 | ES6で登場。外の this をそのまま使える新しい書き方。 |
| レキシカル this | アロー関数が採用してる、this の決まり方。 |
🧓 let _this = this; は今でも使う?
基本は「使わない」でOK!でも、以下のような場面ではまだ出会うかも。
- 古いテーマやプラグインのメンテ中(←今回みたいなケース!)
- ES6が使えないレガシー環境
- jQuery ベッタリのコード
- Babelなどトランスパイル環境を使ってない開発
でも 新しく書くコードではアロー関数を使おう! が現代のスタンダードです。
-
検索
(例) debug search etc.. -
カテゴリー
-
mixhostでのWordPress利用について
更新日:2024/04/02
303 view
-
scrollHint
更新日:2024/03/13
251 view
-
XML Sitemap Generator for Google不具合のダウングレード対応、代替プラグイン
更新日:2024/06/13
243 view
-
【SnowMonkey】納品までのフローまとめ
更新日:2025/02/15
164 view
-
【Snow Monkey】ショートコードで編集画面で任意の場所にHTMLファイルを挿入
更新日:2025/04/18
131 view
-
【Googleサーチコンソール】検索画面で表示させたくない「Googleのインデックス削除」
更新日:2024/06/07
131 view
-
tailwindcss使い方
更新日:2024/03/13
125 view
-
キーワード検索で上位表示させる方法【SEO】
更新日:2023/10/28
120 view
-
Recline: GitHub Copilotで動作するClaude 3.5 Sonnet搭載の開発支援ツール
更新日:2025/01/20
115 view
-
WordPressプラグイン「All-in-One WP Migration」のトラブル
更新日:2022/03/31
84 view
-
ワードプレスセキュリティー対策まとめ【2025年】「site guard wordpress」「BackWPup バージョン5でUI変更!?」
更新日:2025/02/25
77 view
-
VSCodeで開発効率を劇的に向上させる!Roo Code(Roo-Cline)プラグイン完全ガイド
更新日:2025/04/06
75 view
-
Express、FastAPIを使用し、二重fetch構成のメリット
更新日:2025/04/26
51 view
-
SSHを使用してGitHubのリポジトリをクローン、複数の接続元で公開鍵をディレクトリで区別する方法
更新日:2025/01/13
49 view
-
「JSONスキーマ」と「Few-shot Learning」で実現する次世代生成AIソフトウェア開発の可能性
更新日:2025/07/06
44 view
-
Supabase 初心者向け解説、Supabase CLI インストール(Scoop)
更新日:2025/06/07
44 view
-
Windowsショートカットエラーの原因と解決方法「このショートカットは、リンク先のファイルが変更または移動されているので、正しく機能しません」
更新日:2025/02/09
40 view
-
リファクタリング【VSCode Javasctipt Python】
更新日:2025/03/09
37 view
-
Next.jsでAWS Amplifyを使ってPDFアップロード機能を実装、Fast APIにPOST(こちらはApp runner)
更新日:2025/06/06
37 view
-
形態素解析とは?初心者でもわかるツールの使い方と実践例
更新日:2025/02/08
34 view