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

posted on 2011-01-12 14:47  dhj  阅读(113)  评论(0编辑  收藏  举报

导航