评估和功能范围

时间:2016-03-13 23:12:21

标签: javascript scope eval

以下代码似乎有些问题。 它声明了一个带有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

1 个答案:

答案 0 :(得分:2)

因为eval的行为就好像您已将该行替换为要评估的代码。因此,var isTwo = function(value) { return value == 2 }定义了本地变量,并且您的其他功能无法访问该变量。它在外部块中工作的原因是因为它是全局变量,并且可以由您的其他函数访问。