var val = 3;
var code = "var a = 5; if (a >= val) { console.log(a + ' >= ' + val); a; } else { console.log(a + ' < 3 ' + val); val; }";
console.log(eval(code));
在这种情况下,需要eval()的替代方法。
服务器可以发送可以在特定块上运行的任何类型的JS代码。
答案 0 :(得分:0)
请勿使用eval(code)
或new Function(code)
,因为两者基本上是同一件事,应由CSP阻止。
只需以content-type: text/javascript
的形式从服务器返回您的内容,然后使用<script>
块或import
将其放入您的页面即可。
在服务器上,您会看到类似(伪代码,因为我不知道您使用的是哪种技术堆栈):
[Route("serverActionReturningCode")]
public string ActionReturningCode()
{
// return the content as JS
Response.Headers.Add("content-type", "text/javascript");
// build the response object as JS
return "window.latestResult = {" +
"a: '" + a + "', " +
"b: '" + b + "', " +
"generatedCode: function() { ... }" +
"};";
}
然后在您的页面中
<script src="serverActionReturningCode"></script>
<script>
// Now the script above has run and set window.latestResult
console.log('a', window.latestResult.a);
console.log('b', window.latestResult.b);
console.log('function output', window.latestResult.generatedCode());
</script>
这将使您可以在服务器上动态生成JS函数。
但是,如果您可以避免使用这些函数,而只需要传递值,那么使用JSON则要简单得多。
答案 1 :(得分:0)
似乎只能用评估或更改应用程序的整体设计。即使我们寻找其他选择,也将是名称和语法的更改。但是安全性问题将是相同的。服务器上的JS CodeGen工具将生成JS代码段并通过JSON在某些字段中将其发送的应用程序设计,必须在前端进行选择和执行。但是在这种设计中,我们可以保证 JS代码仅在用户设计时生成,而不在运行时生成。 感谢您的帮助。
答案 2 :(得分:-1)
您可以这样做。不建议使用Eval()
。
function looseJsonParse(obj){
return Function('"use strict";return (' + obj + ')')();
}
console.log(looseJsonParse(
"{a:(4-1), b:function(){}, c:new Date()}"
))
请参阅此MDN文章https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval 对其进行更多的挖掘。