![](/img/trans.png)
[英]How do you dynamically call a function in Actionscript 3 from Javascript at runtime without using eval()?
[英]How do you call fat arrow function stored in string without using eval?
您如何在不使用eval的情况下调用以下胖箭头功能(存储在字符串中)?
"g => { alert(g); }"
使用eval,以下代码可以正常工作,但我想避免使用eval。
eval("g => { alert(g); }")('hello')
我希望我可以使用“新功能”执行以下操作,但到目前为止我还没有运气。
new Function("g => { alert(g); }")('hello')
非常感谢。
来自MDN
Function构造函数创建一个新的Function对象。 直接调用构造函数可以动态创建函数,但存在类似于eval的安全性和性能问题。
也就是说,您可以轻松解析字符串以使用函数构造函数,例如:
const str = [g,body] = "g => { console.log(g); }".split(" => "); var myFunc = new Function(g, body); myFunc("hello"); const str2 = [args,body] = "(h,i) => {console.log(h,i);}".split(" => "); const [h,i] = args.replace(/\\(|\\)/g,"").split(","); var myFunc2 = new Function(h,i, body); myFunc2("hello","buddy");
您所做的任何事情,包括您自己的JS解释器,都将等同于eval
的功能。 调用eval()
函数本身并不是安全漏洞。 执行未经消毒的代码是一个安全问题,这就是您要在此处尝试做的事情。 使用eval
或任何等效项会创建XSS漏洞。
如果您使用用JS编写的真实解释器,则可以将代码沙箱化并减轻风险,但是仍然是灰色区域。
OTOH,如果您有正当的理由考虑对所涉及的代码进行清理,则没有充分的理由不使用eval
。
请注意,您无法可靠地清理JS代码。 几乎没有可用的JS语法可以完成任何操作 ,因此代码要么来自受信任的源,要么永远不要运行 。
综上所述,用new Function
编译函数的最简单方法是
(new Function('return ('+code+')'))()
这几乎等同于调用eval(code)
,只是没有对本地名称空间的任何访问权。 直接使用eval()
应该稍微快一些(省略创建不必要的函数对象)。
从理论上讲,这是可行的。 似乎还是个坏主意。
var fatso = "g => { alert(g); }";
var s = document.createElement("script");
s.innerText = "function callMe(f) { var a = " + fatso + "; a(f) }"
document.head.appendChild(s);
callMe("hello");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.