我们有产品(普通桌面应用程序),希望从Adobe产品(从文档,在这些产品中打开)中提取一些数据.由于Apple事件太慢,我们实现了一个定制互操作,它通过套接字将生成的JSX(Adobe的ActionScript3基于不太久的JAVASCRIPT1.5)发送到Adobe产品进程.这比使用事件快2000多倍,但迫使我们做一些涉及eval
的技巧,当前的目标是将非隔离的eval
无意中 destruct JSX引擎状态的风险降至最低.
此代码在受信任的环境(不是浏览器)中运行,并且代码本身也是受信任的,因此关于eval
的任何安全注意事项都不适用.这个问题的主要目的是防止eval
人造成全球范围的污染.
当使用eval
时,则最后一个表达式的结果被认为是整个eval
的返回值,例如,后面代码的eval
-ing的结果将是y+2=12
表达式的值.
var res = eval("
var x = 5;
var y = x*2;
y+2;
"); //res = 12
同时,如果我们将这样的代码包装到Function
构造函数中,那么结果将是undefined
var res = (new Function("
var x = 5;
var y = x*2;
y+2;
")).call(); //res=undefined
要修复最后一段代码,我们需要向最后一个表达式添加显式返回:
var res = (new Function("
var x = 5;
var y = x*2;
return y+2; // <------- changes here
")).call(); //res=12
因此,eval
和Function
具有不同的返回语义.
我不能把eval
替换成Function()
.我还将被迫更改调用方,在代码中添加return
,传递给Function()
.
有没有一种方法可以避免添加显式返回,这样就可以以透明的方式用Function()
替换eval
(假设我们对访问本地作用域不感兴趣)?
或者,也许存在另一种技术,它可以提供等同于eval
的技术,从而将全球范围污染的风险降至最低,并提供与最初的eval
相同的返回语义?