我们有产品(普通桌面应用程序)想要从 Adobe 产品(从在这些产品中打开的文档)中提取一些数据。由于 Apple 事件太慢,我们实现了一个自定义互操作,通过套接字将生成的 jsx(Adobe 的 ActionScript3,基于不久前的 JavaScript 1.5)发送到 Adobe 产品进程。这比使用事件快 2000 多倍,但迫使我们做一些涉及 的技巧eval
,当前的目标是最大限度地减少非隔离的 无意中破坏 JSX 引擎状态的风险eval
。
该代码运行在受信任的环境(而不是浏览器)中,并且代码本身也是受信任的,因此任何有关安全的考虑eval
都不适用。该问题的主要目标是防止eval
.
当使用 时eval
,最后一个表达式的结果被视为整个 的返回值eval
,例如以下代码的 -ing 结果eval
将是表达式的值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()
.
有没有办法避免添加显式返回,因此可以以透明的方式替换eval
为Function()
(假设我们对本地范围的访问不感兴趣)?
或者也许存在另一种技术,它可以提供与eval
将全局范围污染风险降至最低的等效技术,并提供与原始相同的返回语义eval
?