当使用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的行为一致,其余的浏览器行为一致。为什么会出现不一致,规范中是否有相应的约束呢?后面的文章再来说吧。