thisの取り扱い | アロー関数 | JavaScript 超完全入門 基本から発展までのすべて

現在作成中です。今後加筆修正してまいります。
スポンサーリンク
スポンサーリンク

アロー関数とthis

JavaScriptにおけるthisは、通常、その関数が呼び出されたコンテキスト(実行時のオブジェクト)を参照します。しかし、アロー関数の場合、thisの挙動は従来の関数とは異なり、アロー関数が定義された場所のスコープthisを継承します。

通常の関数におけるthis

通常の関数では、関数がどのオブジェクトで呼び出されたかによってthisの参照先が変わります。たとえば、オブジェクト内でメソッドとして関数が呼び出された場合、そのthisは呼び出し元のオブジェクトを指します。

通常の関数におけるthisの例

const person = {
    name: "Taro",
    greet: function() {
        console.log("Hello, " + this.name);
    }
};

person.greet();  // "Hello, Taro" を出力

この例では、greet関数内のthispersonオブジェクトを指し、this.namepersonnameプロパティにアクセスしています。

アロー関数におけるthis

アロー関数では、this定義時のスコープをそのまま保持します。そのため、アロー関数を使うと、thisの参照が変わることなく、一貫して扱うことができます。

アロー関数におけるthisの例

const person = {
    name: "Taro",
    greet: function() {
        setTimeout(() => {
            console.log("Hello, " + this.name);
        }, 1000);
    }
};

person.greet();  // "Hello, Taro" を1秒後に出力

この例では、setTimeout内でアロー関数を使用しているため、thisは外側のgreet関数が定義された時点のスコープを保持します。結果として、personオブジェクトのnameプロパティに正しくアクセスできます。

アロー関数と通常の関数のthisの違い

アロー関数は、従来の関数とは異なりthisが固定され、外部スコープのthisをそのまま使います。これにより、特に非同期処理やコールバック関数内でthisが予期しない値を指してしまう問題を回避できます。

通常の関数とアロー関数のthisの比較

通常の関数 アロー関数
呼び出し時のコンテキストに応じてthisが変わる。 定義時のスコープに基づいてthisが固定される。
コールバック関数内でthisが変わりやすい。 コールバック関数でもthisが安定している。
thisを明示的に変更するためにbindが必要な場合がある。 thisが固定されるため、bindが不要。

非同期処理におけるthisの扱い

アロー関数は、非同期処理において特に便利です。従来の関数では、thisが非同期処理内で変わってしまうことがありましたが、アロー関数を使うことで、thisが意図せず変わるのを防ぐことができます。

非同期処理でのアロー関数の例

const task = {
    name: "Example Task",
    start: function() {
        setTimeout(() => {
            console.log(this.name + " has started.");
        }, 1000);
    }
};

task.start();  // "Example Task has started." を1秒後に出力

この例では、setTimeout内でアロー関数を使用しているため、非同期処理の中でもthisが変わることなく、正しくtask.nameにアクセスできます。

まとめ

アロー関数は、thisの取り扱いにおいて通常の関数と異なり、定義時のスコープのthisをそのまま保持します。これにより、非同期処理やコールバック関数でのthisの参照が安定し、予期せぬ挙動を回避できます。特に、thisが外部スコープを参照すべき状況では、アロー関数が非常に便利です。