给定一个描述 Javascript 函数的字符串,将其转换为 Javascript 函数
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2573548/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Given a string describing a Javascript function, convert it to a Javascript function
提问by brainjam
Say I've got a Javascript string like the following
假设我有一个如下所示的 Javascript 字符串
var fnStr = "function(){blah1;blah2;blah3; }" ;
(This may be from an expression the user has typed in, duly sanitized, or it may be the result of some symbolic computation. It really doesn't matter).
(这可能来自用户输入的、经过适当清理的表达式,或者可能是某些符号计算的结果。这真的无关紧要)。
I want to define fnas if the following line was in my code:
我想定义fn好像以下行在我的代码中:
var fn = function(){blah1;blah2;blah3; } ;
How do I do that?
我怎么做?
The best I've come up with is the following:
我想出的最好的是以下内容:
var fn = eval("var f = function(){ return "+fnStr+";}; f() ;") ;
This seems to do the trick, even though it uses the dreaded eval(), and uses a slightly convoluted argument. Can I do better? I.e. either not use eval(), or supply it with a simpler argument?
这似乎可以解决问题,即使它使用了 dreaded eval(),并且使用了一个稍微复杂的论点。我能做得更好吗?即要么不使用eval(),要么提供一个更简单的参数?
回答by goat
回答by Nick Craver
You can do this:
你可以这样做:
//in your case: eval("var fn = " + fnStr);
eval("var fn = function(){ blah1;blah2;blah3; }");
fn();
Not sure how to get it much simpler, sometimes there's no (better) way around eval(). Here's a quick example of this in action.
不知道如何让它更简单,有时没有(更好的)方法eval()。下面是一个实际的例子。
回答by Eric
Use parentheses.
使用括号。
var fn = eval("(function() {...})");
This technique is also good for transmitting JSON values.
这种技术也适用于传输 JSON 值。
By the way, it's often better to build functions by composing them directly from other functions. If you are using strings, you have to worry about things like unexpected variable capture.
顺便说一句,通过直接从其他函数组合它们来构建函数通常更好。如果您使用字符串,则必须担心诸如意外变量捕获之类的事情。
回答by Julian TF
Here's what I use for simple cases:
这是我用于简单案例的内容:
// an example function
function plus(...args) {
return args.reduce( (s,v) => s+v, 0 );
}
// function to string
let str = plus.toString();
// string to function
let copy = new Function('return ' + str)();
// tests
console.assert(plus.name == 'plus');
console.assert(copy.name == 'plus');
console.assert(plus.constructor == Function);
console.assert(copy.constructor == Function);
console.assert(plus(1,2,3,4) === copy(1,2,3,4));
console.assert(plus.toString() === copy.toString());
回答by Simpal Kumar
The Function constructor creates a new Function object. In JavaScript every function is actually a Function object.
该函数构造函数创建一个新的函数对象。在 JavaScript 中,每个函数实际上都是一个 Function 对象。
// Create a function that takes two arguments and returns the sum of those arguments
var fun = new Function("a", "b", "return a + b");
// Call the function
fun(2, 6);
Output: 8
回答by Arthur Tsidkilov
one way:
单程:
var a = 'function f(){ alert(111); } function d(){ alert(222);}';
eval(a);
d();
second more secure way to convert string to a funciton:
将字符串转换为函数的第二种更安全的方法:
// function name and parameters to pass
var fnstring = "runMe";
var fnparams = ["aaa", "bbbb", "ccc"];
// find object
var fn = window[fnstring];
// is object a function?
if (typeof fn === "function") fn.apply(null, fnparams);
function runMe(a,b){
alert(b);
}
look working code http://plnkr.co/edit/OiQAVd9DMV2PfK0NG9vk
回答by user984003
You can also insert the string into a script element and then insert the script element into the page.
您还可以将字符串插入脚本元素,然后将脚本元素插入页面。
script_ele = window.document.createElement("script");
script_ele.innerHTML = 'function my_function(){alert("hi!");}';
window.document.body.appendChild(script_ele);
my_function();
回答by Satish Kumar sonker
You can call Parse your string as javascript fuction
您可以将您的字符串解析为 javascript 函数
function getDate(){alert('done')}// suppose this is your defined function
function getDate(){alert('done')}// 假设这是你定义的函数
to call above function getDate()is this in string format like 'getDate()'
调用上面的函数getDate()是这样的字符串格式,如'getDate()'
var callFunc=new Function('getDate()')//Parse and register your functioncallFunc()// Call the function
var callFunc=new Function('getDate()')//解析并注册你的函数callFunc()// 调用函数

