感谢所有的想法,我最终只是在输出 JS 的构建脚本中进行文本替换,基本上在压缩所有内容后用 eval 替换 $EVAL$。我希望有一种纯粹的 JS 方式,但是有这么多不同的 eval 浏览器实现,最好不要管 eval
但是根据 Dimitar 的回答和一些摆弄,这就是我发现的。似乎 this['eval'] 不起作用的原因是因为它发生的地方,在 MooTools JSON.decode 中,也是一个哈希内部:
var JSON = new Hash({
// snip snip
decode: function(string, secure) {
if ($type(string) != 'string' || !string.length) return null;
if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
return this.eval('(' + string + ')'); // Firefox says: TypeError: this.eval is not a function
}
});
但是,如果我存储“顶级”本地范围(所有代码,包括 mootools,都在匿名函数中运行),那么它可以工作:
var TOP = this;
var JSON = new Hash({
// snip snip
decode: function(string, secure) {
if ($type(string) != 'string' || !string.length) return null;
if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
return TOP.eval('(' + string + ')'); // All good, things run within the desired scope.
}
});
然而,这在 Safari 中不起作用,所以底线是,我试图做的事情不能交叉兼容。eval 是一个特殊的敏感函数,每个浏览器都以不同的方式对待它。