■スコープとは
→変数が見える範囲のことをさす
■グローバルスコープ
let a = 0;
let b = 0;
window.c = 0;
上のように指定した場合、グローバルスコープとなる。
→グローバルで宣言した変数は、同じスクリプト内ならどこからでも呼び出すことが可能。
■関数スコープ
function a() {
let b = 0;
// このconsole.logは出力される
console.log(b);
}
// 変数bが宣言されているのは関数a野中なので、関数a野中でのみ使用することができる
console.log(b);
■レキシカルスコープ(外部スコープ)
let a = 2;
function fn1() {
let b = 3;
function fn2() {
let c = 4;
}
}
→今回のソースコードでは、aはグローバル変数となるのでfn1、fn2からでも呼び出せる
→fn2からみると外部の変数であるa、b
→これはfn2内で呼び出すことが可能である
→このことをレキシカルスコープ(外部スコープ)という
■クロージャー
数字をインクリメントする関数を作りたい
increment();
increment();
increment();
function increment() {
num = 0;
num += 1;
console.log(num);
};
→上のソースコードだと関数increment()が呼ばれるたびに、numは初期化されてしまうので、
コンソールに出力されるのは0のみ
function incrementFactory() {
num = 0;
function() increment() {
num += 1;
}
return increment;
}
const increment = incrementFactory();
increment();
increment();
increment();
→まず、incrementFactory()が呼び出されることにより、numが初期化される
→その後、incrementFactory内にある関数incrementが返り値で戻ってくる
→そのため,constで宣言したincrementを呼び出しても、numは初期化されることはなく、インクリメントのみが行われるこになる