如何从javascript中的字符串获取函数?
考虑以下代码:如何从javascript中的字符串获取函数?,javascript,Javascript,考虑以下代码: function foo() { alert(1); } var str = foo.toString(); var fn = Function(str); console.log(fn2.toString()); 输出为: function anonymous() { function foo() { alert(1); } } 我正在尝试返回foo函数并将其存储在fn中。 但是这里foo函数在匿名函数中。 我试过eval()。但它在全局范
function foo()
{
alert(1);
}
var str = foo.toString();
var fn = Function(str);
console.log(fn2.toString());
输出为:
function anonymous() {
function foo()
{
alert(1);
}
}
我正在尝试返回foo函数并将其存储在fn中。
但是这里foo函数在匿名函数中。
我试过eval()。但它在全局范围内创建了foo函数
如何从函数的字符串化形式中恢复函数
更新:
我正在创建函数到参数的映射。
为了唯一地标识函数,我使用了toString()方法
更新2:
我用另一种方式解决了这个问题。
本质上,我想创建(函数)-->(参数)的映射以下是相关问题的链接:
.var fn=foo有什么问题代码>?您不需要将函数转换为字符串,除非是出于调试目的。这怎么样
function foo()
{
alert(1);
}
var str = foo.toString();
var fn = Function('return ' + str)();
console.log(fn.toString());
本质上,函数()将尽量不污染全局范围,这就是为什么它在自己的范围内添加函数;因此,它被包装在一个匿名函数中虽然我显然不知道您的完整上下文,但我倾向于同意您可能永远不需要像这样用JavaScript“字符串化”函数 根据我对您的主要目标的理解,可能有更好的方法: 我正在创建函数到参数的映射 没有理由不能使用函数名本身作为键 下面是一个简单的例子:
function foo(x) {
alert(x);
}
function bar(y) {
alert(y);
}
var args = {
foo: [1],
bar: [2]
};
// Now call each function w/ the desired arguments:
for (var funcName in args) {
window[funcName].apply(window, args[funcName]);
}
显然,您会将上面的
窗口
替换为定义了功能的任何范围(如果适用)。需要什么?哦,还有“我试过eval()”不要!如果你需要使用eval
你做错了什么。你想做什么?你的名字和当前的问题都很合适。(只是说)。那么为什么不在表中包含对函数本身的引用呢?eval
不会在全局范围内创建函数,除非您在该范围内执行eval
。这看起来像是一个注释,而不是答案。@FacePalm与使用eval
没有太大区别,如果您试图避免这种情况,“本质上,函数()将尝试不污染全局作用域,这就是为什么它将函数添加到自己的作用域中;因此将其包装在匿名函数中…”它不会将代码包装在函数中以保护全局作用域。我的意思是它确实能做到,但这不是重点Function()
是用于创建函数对象的构造函数。这就是它返回函数的原因。。。因为生成函数是函数构造函数的工作。您还可以定义参数。@svidgen我不太清楚您的意思that@amnotiam是的,你是对的,我只是想指出,这是使用函数的结果,而不是它的意图。但是,你是,我没有把它correctly@ppoliani当然我并不想批评你的回答。(毕竟,这解决了OP的问题!)OP在之前的评论中简单地表示,他们发现了“确凿”的建议,不要使用eval
,我可能错误地认为这意味着应该避免使用它和它的“同伙”。我只是想澄清一下,向函数提供字符串
构造函数也会带来同样的问题。不过,对你的回答没有批评的意思。
function foo(x) {
alert(x);
}
function bar(y) {
alert(y);
}
var args = {
foo: [1],
bar: [2]
};
// Now call each function w/ the desired arguments:
for (var funcName in args) {
window[funcName].apply(window, args[funcName]);
}