给定一个描述 Javascript 函数的字符串,将其转换为 Javascript 函数

IT技术 javascript
2021-01-25 00:33:06

假设我有一个如下所示的 Javascript 字符串

var fnStr = "function(){blah1;blah2;blah3; }" ;

(这可能来自用户输入的、经过适当清理的表达式,或者可能是某些符号计算的结果。这真的无关紧要)。

我想定义fn好像以下行在我的代码中:

var fn = function(){blah1;blah2;blah3; } ;

我怎么做?

我想出的最好的是以下内容:

var fn = eval("var f = function(){ return "+fnStr+";}; f() ;") ;

这似乎可以解决问题,即使它使用了 dreaded eval(),并且使用了一个稍微复杂的论点。我能做得更好吗?即要么不使用eval(),要么提供一个更简单的参数?

6个回答

还有Function对象。

var adder = new Function("a", "b", "return a + b");
@Ozil 不,这没有意义。您需要将字符串表示形式转换为函数。这需要使用可以将字符串计算为 javascript 代码的东西。Eval/功能并不总是邪恶的/他们的威胁被严重夸大了。
2021-03-27 00:33:06
(与 eval 不同) "注意:使用 Function 构造函数创建的函数不会为其创建上下文创建闭包;它们总是在全局范围内创建。运行它们时,它们将只能访问自己的局部变量和全局变量,而不是调用 Function 构造函数的作用域中的那些。这与将 eval 与函数表达式的代码一起使用不同。”
2021-03-29 00:33:06
好的!这更符合我最初寻找的内容。
2021-03-30 00:33:06
可以在不使用 eval() 或 Function 构造函数的情况下完成吗?
2021-04-04 00:33:06
JSLint 抛出一个精辟的“函数构造函数是 eval”。我仍在寻找能够让 Crockford 感到满意的解决方案。
2021-04-13 00:33:06

你可以这样做:

//in your case: eval("var fn = " + fnStr);
eval("var fn = function(){ blah1;blah2;blah3; }"); 
fn();

不知道如何让它更简单,有时没有(更好的)方法eval()这是一个实际的例子

是的,我认为它也不会变得更简单,但是出于某种原因,这让我逃过了一劫。谢谢。
2021-03-15 00:33:06
使用 Function 对象而不是 eval 语句来避免代码异味。
2021-03-17 00:33:06
哇,这是一个伟大的救生员..非常感谢..赞成..:)
2021-03-22 00:33:06

使用括号。

var fn = eval("(function() {...})");

这种技术也适用于传输 JSON 值。

顺便说一句,通过直接从其他函数组合它们来构建函数通常更好。如果您使用字符串,则必须担心诸如意外变量捕获之类的事情

如果您必须将一个函数完全作为字符串通过线路传递,那么这实际上是最有用的。
2021-04-13 00:33:06

这是我用于简单案例的内容:

// 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());
处理这个问题的最好、最安全的方法
2021-03-27 00:33:06

您还可以将字符串插入脚本元素,然后将脚本元素插入页面。

script_ele = window.document.createElement("script");
script_ele.innerHTML = 'function my_function(){alert("hi!");}';
window.document.body.appendChild(script_ele);
my_function();
这是一个聪明的解决方案!
2021-03-25 00:33:06