JavaScriptの字句的な「this」とは?アロー関数で解決する方法
JavaScriptにおける「this」の扱いは、多くの開発者を悩ませるポイントの一つです。特にコールバック関数の中では、「this」が意図しないオブジェクト(グローバルオブジェクトなど)を参照してしまうという問題が発生しがちです。
この問題を解決するのがファットアロー関数(アロー関数)です。アロー関数は自身の「this」を持たず、外側のスコープの「this」のコンテキストをそのまま引き継ぎます。これにより、字句的(レキシカル)な「this」のバインディングが実現され、同じ目的を簡潔に達成できます。
さらに、アロー関数はその名の通りコードの行数を削減する効果もあります。「=>」という構文がファットアローを表しています。
従来のfunctionでの問題点
まず、従来の無名関数(function式)を使った例を見てみましょう。
$('.button1').click(function () {
setTimeout(function () {
$(this).text('demo');
}, 400);
});
上記のコードはエラーになります。なぜなら、function()で定義された関数内の「this」は、呼び出し時のコンテキストに依存するため、setTimeoutのコールバック内ではグローバルオブジェクト(ブラウザではwindow)を参照してしまうからです。結果として、クリックされたボタン要素ではなく、グローバルオブジェクトに対して操作しようとしてしまいます。
アロー関数による解決策
同じコードをファットアロー関数に書き換えると、「this」のコンテキストが正しく保持されます。
$('.button1').click(function () {
setTimeout(() => {
$(this).text('demo');
}, 400);
});
アロー関数には自身の「this」が存在しないため、外側のclick(function () {...})のスコープにある「this」、つまりクリックされたボタン要素(jQueryオブジェクト)を正しく参照できるのです。
補足:アロー関数の特徴
- ES6(ECMAScript 2015)で導入された構文です。
functionキーワードを省略でき、記述が簡潔になります。call、apply、bindを使っても「this」を変更できません。- コンストラクタとして使用できない、
argumentsオブジェクトを持たないなどの制約があります。
コールバック処理で「this」の参照がずれてしまう場面では、アロー関数の活用を検討すると、コードがより安全で読みやすくなります。
-
JavaScriptの関数式(Function Expression)とは?特徴と使い方を解説
JavaScriptにおける関数式(Function Expression)とは、関数を変数に代入して定義する方法のことです。代入された関数は、その変数名を使って後から呼び出すことができます。 関数式の主な特徴 関数を変数に格納し、変数名を指定して呼び出せる 通常の関数宣言(function declaration)と異なり、ホイスティング(巻き上げ)が行われないため、定義よりも前に呼び出すことはできない 多くの場合、名前を持たない「無名関数(匿名関数)」として定義される コールバック関数や即時実行関数(IIFE)など、さまざまな場面で活用できる この「ホイスティングされない」という点が重
-
JavaScriptの簡潔なアロー関数の書き方と実装例
簡潔なアロー関数とは JavaScriptにおける簡潔な(コンサイス)アロー関数の構文は、次のようになります。 (param1, param2) => param1 + param2 この形式には function キーワードがなく、波括弧 {} で囲まれた関数本体もありません。パラメータと関数本体の間に => を置くだけで成立します。 さらに、パラメータが1つだけの場合は、丸括弧を省略して次のように書くこともできます。 param1 => param1 * 2 主な特徴 functionキーワード不要: 通常の関数宣言よりも短く記述できます。 暗黙のリターン: =>