很简单,我想“重新水化”从 AJAX 传递的函数,如下所示:
//AJAX response:
{"foo":"bar","baz":"function(){console.log('I am back working as a function!');}"}
显然,baz
应该是一个函数而不是字符串。我该怎么做?
最佳答案
正如 Jozef 已经建议的那样,您可以使用 eval()
。
但是,如果您通过 Google 搜索,您会发现不建议使用该功能:
- > https://javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval/
- > When is JavaScript's eval() not evil?
- > https://javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval/
- > Why is using the JavaScript eval function a bad idea?
正如这个博客所建议的那样 ( http://2ality.com/2014/01/eval.html ) 我会推荐你使用这个:
let json = {"foo":"bar","baz":"function(){console.log('I am back working as a function!');}"};
let func = new Function("console.log('I am back working as a function!');");
func();
如果您无法更改您的 json,您可以简单地使用 str.replace()
。
请记住,可以执行任意代码! 我会强烈建议您这样做,例如……像这样而不是仅仅用一个函数来响应。通过执行以下操作,您将进行某种白名单。因此,无论 http-response 是否被操纵,攻击者都只能执行预定义的 javascript 函数。
function func1() {
console.log('I am back working as a function!');
}
function func2() {
console.log('another code block');
}
let json = {"foo":"bar","baz":"1"};
switch(json.baz) {
case "1": func1();break;
case "2": func2();break;
default: console.error("Invalid response");
}
希望对您有所帮助。
关于javascript - 通过 AJAX 传递带有函数的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52572068/