JavaScript
はじめに
Webの発展とともにJavaScriptは広く普及しました。
ブラウザで実行できる動的型付け言語といった手軽さの反面、少々クセのある言語でもあります。
今回はJavaScriptプログラミングを行う上で、特に重要だと思う3つのキーワード
- this
- クロージャ
- イベントループ
について紹介していきます。
this
thisとは 実行コンテキストのオブジェクトへの参照 です。
同じようなキーワードはJavaScript以外の言語でも実装されているため、馴染み深いと思います。
(PHPでは $this、Python ではselfなど)
しかしJavaScriptのthisは、他の言語と少し異なり、thisが呼ばれた時のコンテキストによって参照先のオブジェクトが変わる 特徴があります。
thisが呼び出されたコンテキストによって、どのように参照が変わるのか見ていきます。
グーローバルコンテキスト
グローバルコンテキストで呼び出した this は、グローバルオブジェクトを参照します。
// Webブラウザ
console.log(this === window); // ✅ true
// Node.js
console.log(this === global); // ✅ true
※ 以後Webブラウザで実行している前提とします。
クラス
クラス内の this はそのクラスのインスタンスを参照します。
これは他の言語のthisと同じですね。
class Person {
constructor(name) {
this.name = name;
}
sayHello() {
console.log('Hello, ' + this.name); // Hello, Alice
}
}
const person = new Person('Alice');
person.sayHello();
関数内
関数内の this は呼び出し元のオブジェクトを参照しますが、
アロー関数内では、関数が宣言された時点でthisの参照先が確定する という特徴があります。
以下の例では arrow関数 が宣言された時点で参照先がグローバルオブジェクトに確定します。
function func() {
console.log(this === window); // ✅ true
}
const arrow = () => {
console.log(this === window); // ✅ true
};
const obj = {
func,
arrow,
};
obj.func(); // ❌ false (通常関数のthisはobjに変わる)
obj.arrow(); // ✅ true (アロー関数のthisはwindowのまま)
特にアロー関数内でのthis呼び出しで、意図せずグローバルオブジェクトを書き換えてしまう(または意図したオブジェクトを参照出来ていない)のはよくあるケースかと思いますので、
thisの挙動を正しく理解して使用することはとても重要です。
クロージャ
クロージャは関数とその関数が作られた環境という 2 つのものの組み合わせです。
出典: https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures
言葉では分かりづらいので、例を見てみます。
次の createCounter() は関数内で宣言されたcount変数をインクリメントする関数 coutUp() を返す関数です。
function createCounter() {
let count = 0;
return function countUp() {
count++;
console.log(count);
};
}
const counterA = createCounter();
const counterB = createCounter();
counterA(); // 1
counterA(); // 2
counterA(); // 3
counterB(); // 1
counterB(); // 2
counterB(); // 3