備忘録、はじめました。

作業したこと忘れないようにメモっておきます。

レキシカルスコープとダイナミックスコープ

はじめに

レキシカルスコープとダイナミックスコープの違いについて簡単にまとめてみます。

メモ

以下、サンプルコードを元にして説明していきます。

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が返ってきます。

あとがき

レキシカルスコープの言語を触る機会が多いこともあって、レキシカルスコープがしっくりきます。

参考URL

レキシカルスコープとダイナミックスコープ | すぐに忘れる脳みそのためのメモ