gpt4 book ai didi

javascript - 如何在JavaScript中不写 "eval"就执行 "eval"

转载 作者:数据小太阳 更新时间:2023-10-29 04:41:23 29 4
gpt4 key购买 nike

这是交易,我们有一个很大的 JS 库需要压缩,但是 YUI compressor如果发现“eval”语句,它不会完全压缩代码,因为担心它会破坏其他东西。这很好,但是我们确切地知道什么正在被评估,所以我们不希望它变得保守,因为在 MooTools JSON.decode 中有一个 eval 语句

所以基本上问题是,是否有任何其他(可能是创造性的)方法来编写返回 eval 函数的表达式?我尝试了一些,但没有骰子:

window['eval'](stuff);
window['e'+'val'](stuff);
// stuff runs in the global scope, we need local scope

this['eval'](stuff);
// this.eval is not a function

(new Function( "with(this) { return " + '(' + stuff + ')' + "}"))()
// global scope again

有什么想法吗?谢谢

最佳答案

感谢所有想法,我最终只是在输出 JS 的构建脚本中进行文本替换,基本上是在所有内容都被压缩后用 eval 替换 $EVAL$。我希望有一种纯 JS 的方式,但是有这么多不同的 eval 浏览器实现,最好还是单独留下 eval

但根据 Dimitar 的回答和一些摆弄,这就是我的发现。似乎这个 ['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 是一个特殊的敏感函数,每个浏览器都以不同的方式对待它。

关于javascript - 如何在JavaScript中不写 "eval"就执行 "eval",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2195347/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com