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)
哪个看似正常?是什么赋予了?我没有看到任何违反范围的行为?
答案 0 :(得分:1)
如果你间接使用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