关于模块的雄辩的javascript章节。关于范围和评估功能

时间:2015-06-16 03:39:06

标签: javascript scopes

Eloquent javscript在模块章节的第10章中写道:

  

最明显的方法是执行特殊运算符eval   当前范围中的一串代码。这通常是一个坏主意   因为它打破了一些正常范围的理智属性   有,例如与外界隔绝。

以下是代码:

function evalAndReturnX(code) {
  eval(code);
  return x;
}

console.log(evalAndReturnX("var x = 2"));
console.log(x)
console.log(code)

输出:

2
ReferenceError: x is not defined (line 7)

哪个看似正常?是什么赋予了?我没有看到任何违反范围的行为?

1 个答案:

答案 0 :(得分:1)

Eval有一些棘手的语义。来自mdn

  

如果你间接使用eval函数,可以通过a调用它   除了eval之外的参考,从ECMAScript 5开始,它在全球范围内工作   而不是局部范围;这意味着,例如,该功能   声明创建全局函数,代码是   评估无法访问范围内的局部变量   在哪里被召唤。

因此,在您的情况下,因为您在该函数中直接调用eval,所以它在该函数的词法范围内定义x,不适用于全局范围。但是,如果你要做这样的事情:

var _eval = eval;

function e() {
    _eval("var x = 2");
    return x;
}

console.log(e());
console.log(x);

它可以在两种情况下都有效,因为这会在全局范围内定义x,这将由被调用者的词法范围继承。

有关工作示例,请参阅this fiddle