web関連
【javascript】グローバルスコープとローカルスコープ(関数スコープ、ブロックスコープ)
スコープ周りをざっくり理解するための備忘録
グローバルスコープ
グローバルスコープであればどこからでもアクセスできる
var a = 'Global';// グローバルスコープの宣言
(function(){ // 即時関数 始まり
console.log(a);// 出力:Global
})(); // 即時関数 終わり
console.log(a);// 出力:Global
ローカルスコープ
関数内で宣言をした場合は関数内でのみ扱えるローカルスコープになる
var a = 'Global';// グローバルスコープ
(function(){ // 即時関数 始まり
var a = 'Local';// ローカルスコープ
console.log(a);// 出力:Local
})();// 即時関数 終わり
console.log(a);// 出力:Global
関数スコープ(ローカルスコープ)
従来のローカルスコープ
function(){…}
を使ったやつ
変数宣言var
を筆頭にes6(ES2015)から追加されたlet
やconst
も使える
「ローカルスコープ=関数スコープ」という考えでok
※書き方は上記と同じなので省略
ブロックスコープ(ローカルスコープ)
es6(ES2015)から追加されたスコープ
{…}
波括弧で囲む({…}
だけでもok)
※if文やfor文もブロックスコープに当たる(詳しくはこちら)
var
を使うとグローバルスコープでブロックスコープにはならない
let
やconst
を使うとブロックスコープ(ローカルスコープ)になり、外からアクセスできなくなる
ブロックスコープ例
let a = 'Global';// グローバルスコープ
{ // ブロックスコープ 始まり
let a = 'Local';// ローカルスコープ(ブロックスコープ)
console.log(a);// 出力:Local
} // ブロックスコープ 終わり
console.log(a);// 出力:Global
var
を使うとグローバルスコープが汚染される
var a = 'Global';// グローバルスコープ
{ // ブロックスコープ 始まり
var a = 'Local';// ローカルスコープ(ブロックスコープ)
console.log(a);// 出力:Local
} // ブロックスコープ 終わり
console.log(a);// 出力:Local←汚染される
以下の備忘録でもう少しブロックスコープについて掘り下げてみたのでリンクを貼っておく