ecmascript 5-Eval真的为JavaScript引入了动态作用域吗

ecmascript 5 - Does Eval really introduce dynamic scoping to JavaScript?

本文关键字:动态 作用域 5-Eval 真的 JavaScript ecmascript      更新时间:2023-09-26

人们说Eval在JavaScript中引入了动态作用域,但我不认为这句话是有效的。使用Eval使用与调用环境相同的词汇环境/变量环境来评估表达式(参考ECMA 262 v.5(。表达式的赋值声明显然是动态的,但我认为说它引入了动态范围是无效的。

我说Eval没有引入动态范围是对的吗?

是和否

严格意义上说,不;该语言仍然在词汇上运行(除了this,它总是动态范围的(。

然而,如果你阅读了链接到的整个问题,你会发现提问者正在使用eval来模拟动态范围

var x = 1;
function g() {
    print(x);
    x = 2;
}
function f() {
    // create a new local copy of `g` bound to the current scope
    // explicitly assign it to a variable since functions can be unnamed
    // place this code in the beginning of the function - manual hoisting
    var g = eval(String(g));
    var x = 3;
    g();
}
f();                         // prints 3
print(x);                    // prints 1

模拟动态作用域完全可以通过问题的询问者使用它的方式实现。询问者使用eval将外部定义的函数实际导入另一个函数的作用域。这需要对函数进行字符串化并重新解析。因此,外部定义的函数并没有真正在另一个函数的范围内运行(本例并没有严格意义上的动态范围(,因为声明了一个全新的函数。话虽如此,询问者的意图是模仿动态范围,他正在通过eval实现这一点。