静态词法作用域

最近在看 rust,里面提到静态词法作用域,一个神奇的 deja-vu,于是我急忙查了下它是啥。

rust 和 js 都是静态词法作用域,简单说,作用域中的变量在编译时已经确定,不会随着运行时变化而变化。

var a = 1;

function foo() {
  var a = 2;

  bar();
}

function bar() {
  console.log(a);
}

foo(); // print 1

而相对的 shell 就是动态作用域。

value=1

function foo() {
    local value=2;
    bar;
}

function bar() {
    echo $value;
}

foo;# print 2

动态作用域被广泛应用于早期动态语言,猜测是早期运行环境内存比较少不能装拿这么多东西吧。