レキシカルスコープとダイナミックスコープ
はじめに
レキシカルスコープとダイナミックスコープの違いについて簡単にまとめてみます。
メモ
以下、サンプルコードを元にして説明していきます。
1: func X(){ 2: print(s) 3: } 4: 5: func Y() int{ 6: s := 12 7: X() 8: return s 9: }
上記のコードで想定している出力結果は、関数Yを呼び出したら12が出力されることとします。 実行している内容は、関数Yで定義された変数sを関数Xで出力するというものです。 下記、2つにスコープに分けて説明します。
レキシカルスコープ
2行目で変数sを出力しようとしていますが、関数X内では変数sが定義されていないため、変数の未定義となりエラーか何かを返します。すなわち、期待した結果を得るためには、
1: func X(s int){ // 引数を渡す 2: print(s) 3: } 4: 5: func Y() int{ 6: s := 12 7: X(s) 8: return s 9: }
としてやるなどの方法があります。
ダイナミックスコープ
関数Yを実行した場合のスコープは関数Yの範囲となります。したがって、Y関数内で呼びだされているX関数のスコープも実行した関数Yとなり、変数sを参照することが可能となります。結果として、12が返ってきます。
あとがき
レキシカルスコープの言語を触る機会が多いこともあって、レキシカルスコープがしっくりきます。