window.eval 及相关方法总结

翻译|其它|编辑:郝浩|2007-09-26 10:05:53.000|阅读 1091 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

前面有帖子说到在函数里如何能在全局空间上  eval 虽然此种需求在绝大多数情况下是不合理的,但是仍有极少数情况可能确实有需要。

Jscript    execScript  方法可以用来执行脚本。其第一个参数为代码字符串,第二个参数为脚本语言,可以选择  jscript  或者  vbscript

而在其他脚本引擎中,SpiderMonkey  保留了  JS  最早时候的在对象上的  eval  方法。也就是在任何对象上,都可以  eval,执行时,会把该对象加入  scope chain

例如 {x:1}.eval('x')会返回1,而(o={x:2}).eval('var x = 10')o.x会等于10

基本上  o.eval(code); 类似于  with (o) { eval(code) }

唯一值得注意的是  var x  这样的语句。对于
var o = {x:1};
with(o) {
var x = 2;
}

SafariJavaScriptCore    KJ  S引擎)会产生一个全局的  x  变量。除此之外(JScriptSpiderMonkeyOperaRhino  等),都会令  o.x = 10。注意:前提条件是  o  上面已经有x属性。

  SpiderMonkey  所具有的  Object.eval  方法,我们可以知道,在  Firefox  中,window.eval()与直接  eval()的效果是不同的。前者的效果接近  execScript

其他引擎不支持  Object.eval,但是  Opera    window.eval  作为一个特例,与  Firefox  的效果是一样的。除了  Safari  以外,我们也可以用  with(window) {eval(...)}来模拟  execScript,但前提是你知道所有在  global  上声明的  var  的名字,并预先在  window  上创建这些变量——多数情况下这不太实际。

SpiderMonkey    eval  还可以传第二个参数,eval(code, o)基本等价于  o.eval(code),但是两者还是有微妙的差别。如

var a = 'global';
var code = 'alert(a)';
var context = (function () { return function a() {} })();
context.eval('alert(a)');
eval('alert(a)', context);

这两次返回的值是不同的。在  eval(code, o)的时候,会继续从  o.__parent__(即[[scope]])开始寻找。而函数表达式的名字,或者函数外部的  with  语句,都会给其[[scope]]增加一层对象。

关于  new Function(code),实际上  PIES  就是使用的这个方法来生成代码而不是像其他一些框架那样使用  eval。另外我还用它来做对模板的编译。使用  Function    eval  要好很多。因为它总是在一个新的  execution context  上,从而避免了许多  eval  可能出现的  bug(早期版本的浏览器经常在某些特殊  eval  时崩溃)。所以如果需要生成代码,应优先使用  new Function

但是  new Function  对于需要执行  var x=1,把  x  放到  global  的需求,是不合适的。虽然这种需求非常罕见(以至于多数情况下这种需求是错误的需求),但因为本文恰恰是说这个问题,因此就略过。

事实上,对于  SpiderMonkey    Rhino  来说,还有另一个方法,也是推荐的方法,那就是使用  Script  方法。Script(code)的结果是一个函数,可以直接调用。例如  Script('var a = 1')(),无论在哪里执行,都会在 global  上产生  a  变量。实际上  Script  结果的调用就是对  Script.prototype.exec  的调用。Script.exec,基本上是  execScript  的真正对应。注意,Rhino  上必须直接调用而不能用  Script(code).exec()调用。SpiderMonkey    Script.exec  可以带有参数,如果带有参数  obj,效果就跟  eval(code, obj)接近。

好,最后总结一下:

JScript
上使用execScript(code)
SpiderMonkey
Rhino上可使用Script(code)()
Opera
下使用window.eval(code)

唯一的问题是  Safari。实际上  window.eval  已经被作为一个  bug  被提交并且  fixed  了,我们希望下一个版本的  Safari  应该就可以与  Opera  一样,使用  window.eval  了。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:JavaEye

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP