javascript是否允许别名评估? 以下代码的第一部分意外行为(显示1,1),但第二部分不行(显示1,2)。 对ECMA脚本或mozilla文档的引用会很有帮助,我找不到。
<html>
<script type="application/javascript;version=1.8">
(function(){
eval('var testVar=1');
alert(testVar);
var eval2=eval;
eval2('var testVar=2');
alert(testVar);
})();
(function(){
eval('var testVar=1');
alert(testVar);
eval('var testVar=2');
alert(testVar);
})();
</script>
</html>
答案 0 :(得分:7)
您不能“别名”eval
并期望它的行为相同。就那么简单。为什么? eval
不是函数。
当您调用eval2
时,您正在设置变量“cache”以使用全局变量。因此,通过在其中设置变量,您将设置全局变量。但是,在退出时,变量“cache”返回到函数作用域。这就是第二个alert
显示1的原因 - 全局变量被函数级别1遮蔽。
这在ECMAScript(强调我的)附件E(第239页)中有说明
10.4.2:在第5版中,对eval函数的间接调用使用全局环境作为变量环境和eval代码的词法环境。在第3版中,间接eval的调用者的变量和词法环境被用作eval代码的环境。
“输入评估代码”的完整定义在§10.5.2(第58页)中定义(强调我的)
答案 1 :(得分:2)
在第一种使用eval
的情况下,它使用执行它的函数作用域。当您将eval
分配给eval2
然后执行相同的语句时,它似乎使用window
上下文(全局范围)而不是函数上下文。这就是为什么你在第一种情况下看到相同的值1,因为函数内的testVar
是1而window.testVar
外面是2.你可以通过执行下面的代码片段来证明这一点
<script>
(function(){
eval('var testVar=1');
alert(window.testVar);
var eval2=eval;
eval2('var testVar=2');
alert(window.testVar);
})();
(function(){
eval('var testVar=1');
alert(testVar);
eval('var testVar=2');
alert(testVar);
})();
</script>
实际上,根据Mozilla Developer Network,您不能为eval添加别名。