ローカルスコープとグローバルスコープは、プログラミングにおいて変数や関数がどの範囲で有効かを定義する概念です。
ローカルスコープは、関数内で定義された変数や関数が有効な範囲を指します。つまり、その関数内でしかその変数や関数にアクセスできないということです。ローカルスコープ内で定義された変数は、関数の実行が終了すると同時に破棄されます。
一方、グローバルスコープは、プログラム全体で定義された変数や関数が有効な範囲を指します。つまり、どの関数からでもアクセスできるということです。グローバルスコープで定義された変数は、プログラムが終了するまで有効です。
ローカルスコープとグローバルスコープは、プログラミングにおいて非常に重要な概念であり、変数のスコープを正しく理解することは、プログラムのバグを防ぐ上で重要です。
JavaScript・Ruby・PHPなどのプログラミング言語での扱いについて
- JavaScript
JavaScriptでは、letやconstを使って変数を宣言することができます。letで宣言された変数はブロックスコープを持ち、constで宣言された変数は再代入ができないため、定数として扱われます。
function test() { let x = 1; // ローカルスコープ if (true) { let x = 2; // ブロックスコープ console.log(x); // 2 } console.log(x); // 1 } test();
上記の例では、test関数内でletで宣言された変数xはローカルスコープを持ち、if文内で再度letで宣言された変数xはブロックスコープを持ちます。console.logでの出力結果から、それぞれのスコープが異なっていることがわかります。
- Ruby
Rubyでは、ローカルスコープとグローバルスコープがあります。変数名の先頭に$を付けることで、グローバルスコープの変数を宣言することができます。
def test x = 1 # ローカルスコープ if true x = 2 # ローカルスコープ $y = 3 # グローバルスコープ puts x # 2 puts $y # 3 end puts x # 2 end test puts $y # 3
上記の例では、testメソッド内でxという変数がローカルスコープを持ち、if文内で再度xという変数が宣言された場合でも、ローカルスコープ内のxと同じ変数として扱われます。一方で、$yという変数はグローバルスコープを持ち、どこからでも参照することができます。
- PHP
PHPでも、ローカルスコープとグローバルスコープがあります。グローバルスコープの変数を宣言するためには、変数名の先頭に$GLOBALSを付けます。
function test() { $x = 1; // ローカルスコープ if (true) { $x = 2; // ローカルスコープ $GLOBALS['y'] = 3; // グローバルスコープ echo $x; // 2 echo $GLOBALS['y']; // 3 } echo $x; // 2 } test(); echo $GLOBALS['y']; // 3
上記の例では、test関数内で$xという変数がローカルスコープを持ち、if文内で再度$xという変数が宣言された場合でも、ローカルスコープ内の$xと同じ変数として扱われます。一方で、$GLOBALS['y']という変数はグローバルスコープを持ち、どこからでも参照することができます。最後に、グローバルスコープの変数$yの値をecho文で出力すると、3が表示されます。