Javascript 评估和功能范围

Javascript 评估和功能范围,javascript,scope,eval,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 co

以下代码似乎有问题。 它用
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}
定义了一个local变量,其他函数无法访问该变量。它在外部块中工作的原因是,它是一个全局变量,可以被其他函数访问

isTwo
不在第一个代码的
fn
范围内。不要使用
eval
声明变量。这是一种不好的做法,在严格的模式下是被禁止的。@Oriol你不知道我想达到什么目的,所以你可能会指出eval中的一些文章是邪恶的方向,但你可以权衡你的话^^^@yvesamsellem我没有说
eval
是邪恶的<代码>评估是危险的,但如果你知道自己在做什么,它会很有用。但是,在严格模式下不允许使用它来声明变量。你之所以能够做到这一点,是因为由于向后兼容,不可能杀死sloppy模式。是的,
eval
让我大吃一惊,所以我失去了JavaScript。谢谢。