25. MinRuby / ミニNode.js の変数の実装
• ブロックスコープは無い
function func(a) {
let x = 1;
if (a == 1) {
let x = func1(a);
// … 省略 …
}
else if (a == 3) {
let x = func2(a);
// … 省略 …
}
// …
}
対象ソースコード
Node.js / JavaScript ならブロックスコープ
x は全て別の変数として扱われる
ミニNode.js ではすべて同じ関数ローカルスコープ
x は同じ変数として扱われる
※重複定義でエラー
グローバル変数や、ブロックスコープをきちんと扱うには
特別な配慮が必要なことを実感
26. MinRuby / ミニNode.js のユーザ定義関数
• 関数定義は、genv[]というハッシュ(連想配列)に格納される
• 呼び出し時に、genv[]の中を探して呼び出す
• 先に定義しておく必要がある
• 一見関数内のローカル関数が使えそうだが、実際はグローバル関数になる
function func1(a) {
function func2(x) {
return x*2;
}
return func2(a+1);
}
function func2(y) {
return y+2;
}
これは二重定義のエラー
function func1(a) {
function func2(x) {
return x*2;
}
return func2(a+1);
}
function func2(x) {
return x*2;
}
function func1(a) {
func2(a+1);
}
対象ソースコード ミニNode.jsの解釈