ecmascript 5-Eval真的为JavaScript引入了动态作用域吗
ecmascript 5 - Does Eval really introduce dynamic scoping to JavaScript?
人们说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实现这一点。
相关文章:
- 将变量动态添加到每个控制器的作用域
- AngularJS观察指令属性表达式,动态继承作用域
- 如何创建作用域的动态、基于实例的对象文字
- JavaScript/循环混淆中的动态作用域与词法作用域
- 通过json动态绑定作用域到ng模型
- 如果在transclusion之后添加,为什么指令下的动态元素具有错误的作用域
- 尝试使在专用作用域中动态更改的变量全局化
- 将泛型函数动态关联到对象属性时的作用域.(模块模式)
- 作用域和将参数传递给动态创建的事件处理程序时出现问题
- 使用指令作用域变量呈现的动态模板
- 作用域的动态变量名称
- 从作用域绑定的动态控制器
- Angular中的动态作用域变量名
- AngularJS -动态作用域
- 具有动态作用域编译的动态模板
- 如何在angularjs中为for循环添加动态作用域变量
- 如何在Angular指令中使用动态作用域名称
- ecmascript 5-Eval真的为JavaScript引入了动态作用域吗
- 如何在ng-repeat中传递动态作用域值
- 获取动态作用域变量值angularjs