LoginSignup
4
1

More than 3 years have passed since last update.

【JavaScript】スコープについて【まとめ】

Last updated at Posted at 2020-11-17

スコープってなに?

demo

プログラミングにおけるScope(スコープ)とはある変数や関数が特定の名前で参照される範囲のことを言う

要は今実行中のコードからその変数や関数が見えるか見えないか(参照できるかできないか)ということ

実際に見てみる

↓このコードを実行すると

main.js
{
  let a = 0;
  const b = function () {}
  debugger; //実行中のコード
}

demo
変数a関数bが参照できているのがわかる


↓次にこのコードを実行すると

main.js
{
  let a = 0;
  const b = function () {}
}
debugger; //実行中のコード

demo

aとbが参照できない・・・

つまり実行中のコード(今回はdebugger;)から変数や関数が見える範囲をスコープという

スコープの種類

JavaScriptには5種類のスコープが存在する。

  • グローバルスコープ

  • スクリプトスコープ

  • 関数スコープ

  • ブロックスコープ

  • モジュールスコープ

グローバルスコープ

スクリプトファイル直下varfunctionで定義するとここに入る

main.js

var a = 0;
function b() {}
debugger; //実行中のコード

スクリーンショット 2020-11-13 6.43.45.png

スクリプトスコープ

スクリプトファイル直下letconstで定義するとここに入る

main.js

let a = 0;
const b = function() {}
debugger; //実行中のコード

スクリーンショット 2020-11-13 6.58.33.png

グローバルスコープスクリプトスコープはそのファイル内であればどこからでも参照可能。

関数スコープ

名前の通り、関数の中のスコープ。

その関数内であれば変数bが参照できることがわかります。
スクリーンショット 2020-11-13 7.27.53.png

一方関数の外では参照できません。

スクリーンショット 2020-11-13 7.27.14.png

ブロックスコープ

ブロックって?
↓これです
スクリーンショット 2020-11-13 7.34.02.png
この{}の中をブロックスコープと言います。
記事の一番最初の例がブロックスコープの例となります。

if文for文の中で定義された変数もブロックスコープとなります。
スクリーンショット 2020-11-13 7.38.53.png
スクリーンショット 2020-11-13 7.40.50.png

もちろんこれらもブロック外からは変数を参照できません。

モジュールスコープ

モジュール(ESM)を使用した際にスクリプトスコープモジュールスコープに切り替わる。
inport / export を使用しないと別ファイルの変数や関数を参照できない。

【JavaScript】基本的なモジュール(ESM)の使い方についてまとめ

レキシカルスコープ

これはどのようにしてスコープが決定するかの仕様のことです。

例として、まず関数f1を定義します。
その中に変数aを定義しています。

ここで1つの関数スコープができました。

main.js

const f1 = () => {
  let a = 0;
}
f1();

さらに関数f1の中に関数f2を定義します。

ここで関数スコープの中にもう1つの関数スコープができました

変数aを出力させ、実行します。
結果として、変数aの値を取得し出力されます。

main.js

const f1 = () => {
  let a = 0;
  const f2 = () => {
    console.log(a); // => 0
  }
  f2();
}
f1();

この時実行中の関数f2外側にあるスコープから変数を参照しています。
この外側にあるスコープを外部スコープ(レキシカルスコープ)と言います。

スクリーンショット 2020-11-17 8.34.35.png

また、このようにスコープが複数階層になっている状態をスコープチェーンと言います。

スコープチェーン

スコープが複数階層で、連なっている状態のこと。

スコープチェーンでは一番内側のスコープから順番に変数を取得していく仕様です。

main.js

let a = 0;
const f1 = () => {
  let a = 1;
  const f2 = () => {
    let a = 2; //     <-これ
    console.log(a); // => 2
  }
  f2();
}
f1();
main.js

let a = 0;
const f1 = () => {
  let a = 1; //      <-これ
  const f2 = () => {
    // let a = 2;
    console.log(a); // => 1
  }
  f2();
}
f1();
main.js

let a = 0; //        <-これ
const f1 = () => {
  // let a = 1;
  const f2 = () => {
    // let a = 2;
    console.log(a); // => 0
  }
  f2();
}
f1();


以上、スコープについてでした!
ここまで見ていただきありがとうございました。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1