Javascript eval 别名

标签 javascript

javascript 是否允许使用别名 eval? 以下代码的第一部分行为异常(显示 1、1),但第二部分没有(显示 1、2)。 对 ECMA 脚本或 mozilla 文档的引用会有所帮助,但我找不到。

<html>
<script type="application/javascript;version=1.8">
    (function(){
        eval('var testVar=1');
        alert(testVar);
        var eval2=eval;
        eval2('var testVar=2');
        alert(testVar);
    })();

    (function(){
        eval('var testVar=1');
        alert(testVar);
        eval('var testVar=2');
        alert(testVar);
    })();
</script>
</html>

最佳答案

您不能“别名”eval 并期望它表现相同。就那么简单。为什么? eval 不是函数。

发生的事情是,当您调用 eval2 时,您正在设置变量“缓存”以使用全局变量。因此,通过在其中设置一个变量,您就是在设置一个全局变量。但是,退出时,变量“缓存”返回到函数作用域。这就是为什么第二个 alert 显示 1 - 全局变量被函数级别 1 隐藏。

这在 ECMAScript 的附件 E(第 239 页)中有说明(重点是我的)

10.4.2: In Edition 5, indirect calls to the eval function use the global environment as both the variable environment and lexical environment for the eval code. In Edition 3, the variable and lexical environments of the caller of an indirect eval was used as the environments for the eval code.

“输入评估代码”的完整定义在 §10.5.2(第 58 页)(强调我的)中定义

  1. 如果没有调用上下文或如果未通过直接调用评估 eval 代码 (15.1.2.1.1) 到 eval 函数,那么,
    • 将执行上下文初始化为全局执行上下文,使用 10.4.1.1 中所述的作为 C 的 eval 代码。
  2. 否则,
    • 将 ThisBinding 设置为与调用执行上下文的 ThisBinding 相同的值。
    • 将 LexicalEnvironment 设置为与调用执行的 LexicalEnvironment 相同的值 上下文。
    • 将 VariableEnvironment 设置为与调用执行的 VariableEnvironment 相同的值 上下文。
  3. 如果评估代码是严格代码,那么
    • 让 strictVarEnv 成为调用 NewDeclarativeEnvironment 并将 LexicalEnvironment 作为参数传递的结果。
    • 将 LexicalEnvironment 设置为 strictVarEnv。
    • 将 VariableEnvironment 设置为 strictVarEnv。
  4. 使用 eval 代码按照 10.5 中的描述执行声明绑定(bind)实例化。

关于Javascript eval 别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17770754/

相关文章:

javascript - 如何使用meteor-jsdoc忽略.meteor目录中的代码文档

javascript - 在 Javascript 中使用 .prototype 的原因

javascript - jQuery,AJAX 使用 JSON 发布 Javascript 数组

javascript - 是否可以在 TypeScript 中使用类型化流?

javascript - HTML Web 表单 vals 到我的 JavaScript 数据 Obj

javascript - 循环通过 Jquery 上的类来制作动画

javascript - Canvas 碰撞?

JavaScript - 如何从上到下滚动 li 元素

javascript - Rails Angular grunt 代理

javascript - AngularJS - 尝试使用 ng-switch 和 ng-click 改变背景颜色