動的スコープ
dynamic scope
ダイナミックスコープ
関数を実行した場所でスコープが決まる
実行時にスタックをたどって変数を探す
よって、コードの呼び出し順にスコープが決まる
動的スコープにおける名前束縛のことを動的束縛という 例1
code:example
var x = 100;
var a = () => {
var x = 0;
return () => x;
};
var b = a();
x; // 100
b(); // 100
例2
code:example
var x = 100;
var b = () => x;
var a = () => {
var x = 0;
return b();
};
x; // 100
a(); // 0
a()を呼び出したときのコールスタックは
code:callstack
a // aが呼び出された、中身を見てみよ、あ、b呼んでるやんb呼ぼ
b // bが呼び出された、中身を見てみよ、xをreturnしてるね、xってなんや?bの中身見てみよ
x=0 // あ、bの中でx=0ってしてるやん!
例3
code:example
var x = 100;
var a = () => x;
a(); // undefined
実装が容易な動的スコープのLispを実装してみようという記事
言語例