【转】再来说说eval
当使用eval方法时,你可以直接调用eval(expression),也可以调用window.eval(expression)或者window["eval"](expression)。这三种不同的调用方法在不同浏览器环境中是有差别的。具体请看下面的示例:
首先准备三个测试函数a、b、c:
function a() {
var inner = 1;
try {
eval('inner += 1');
}
catch (e) {
alert(e.message);
}
alert(inner);
}
function b() {
var inner = 1;
try {
window.eval('inner += 1');
}
catch (e) {
alert(e.message);
}
alert(inner);
}
function c() {
var inner = 1;
try {
window['eval']('inner += 1');
}
catch (e) {
alert(e.message);
}
alert(inner);
}
函数都非常简单,定义一个函数私有变量inner,eval的代码将这个inner加1。为了捕捉问题使用了try/catch将eval代码包含进去。以下是测试结果(inner的最终值):
IE6:2 2 2
IE7:2 2 1
IE8:2 2 1
IE9:2 1 1
FF3:2 2 2
FF4:2 1 1
Chrome:2 1 1
Safari:2 1 1
Opera:2 1 1
inner为2的时候eval的代码执行成功,inner为1的时候所有浏览器都会提示inner是未定义的。可以看出,IE6和FF3的行为一致,IE7和IE8的行为一致,其余的浏览器行为一致。为什么会出现不一致,规范中是否有相应的约束呢?后面的文章再来说吧。