评估和函数作用域

Eval and function scope

本文关键字:作用域 函数 评估      更新时间:2023-09-26

以下代码似乎有问题。它用eval声明一个函数,调用它——在那之前,一切都很好——然后,再次调用它,但虽然是一个函数,因此得到一个错误。

var fn = function() {
    return isTwo(2);
};
var check = function() {
    eval("var isTwo = function(value) { return value == 2 }")
    console.log(isTwo(2)); // returns true
    console.log(fn()); // returns isTwo is not defined
}
check();

解开check函数的包装使事情变得有效,但似乎错误。为什么在函数中使用eval应该改变它的行为?

var fn = function() {
    return isTwo(2);
};
eval("var isTwo = function(value) { return value == 2 }")
console.log(isTwo(2)); // returns true
console.log(fn()); // returns true

因为eval就像您用要计算的代码替换了该行一样。因此,var isTwo = function(value) { return value == 2 }定义了一个局部变量,其他函数无法访问它。它在外部块中工作的原因是因为它是一个全局变量,并且可以由您的其他函数访问。