JavaScriptのthisについて

会社のインターン生に Javascriptthis についてドヤ顔で説明してたら、間違って理解していたことがわかってしまった。

同僚と this がどういう挙動をするのかで盛り上がって楽しかった。

【JS】ああthisよ。君は今、どのオブジェクトなのか(練習問題あり)

同僚の @valley 氏の記事がおおよそすべてを説明してくれているが、この記事では自分の言葉で this について説明する。


元記事ではブラウザで実行していたが、この記事では nodejs で実行するので window -> global となる。

結局そのscopeが評価された時のcontextがthisになる。
関数やオブジェクトが評価されるタイミングはいつなの?ってことを考えればあとは自然とthisを導き出せる。
functionが評価されるタイミングとlambdaが評価されるタイミングが違うというだけ。

例えば、以下のようなスクリプトがある。

func1 の関数が評価されるのは実行時なので {} だが、 func2 の関数が評価されるのはコンパイル時なので global になる。

const func1 = () => {
    console.log(this);
};

const func2 = function () {
    console.log(this);
};

console.log(func1); // {}
console.log(func2); // global

ファイル分割した場合はどうなるだろうか。以下のようなコードを書いてみた。

test.js:

const { func1, func2 } = require("./test1.js");

console.log(this.aaa); // undefined

func1(); // { aaa: 'bbb' }
fund2(); // global

test1.js:

this.aaa = 'bbb';

const func1 = () => {
    console.log(this);
};

const func2 = function () {
    console.log(this);
};

module.exports = { func1, func2 };

教えるのも勉強なるし、こうやって深堀するとさらに詳しく慣れて楽しい。