请考虑以下代码:
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函数在Anonymous函数中。 我试过eval()。但它在全球范围内创建了foo函数。
如何从字符串化表格中取回函数?
更新 我正在为参数创建函数映射。 为了唯一地标识函数,我使用了toString()方法。
var map[foo.toString()] = [1,2,3]; //this list is populated dynamically in my code
// Now I want to call foo with [1,2,3] as arguments. For this I need to get back foo() function
foo(1,2,3)
更新2:
我以不同的方式解决了这个问题。
基本上我想创建(功能) - >的地图(参数)
以下是相关问题的链接:
stackoverflow post
答案 0 :(得分:2)
这个怎么样
function foo()
{
alert(1);
}
var str = foo.toString();
var fn = Function('return ' + str)();
console.log(fn.toString());
本质上,Function()将尽量不污染全局范围,这就是为什么它在自己的范围内添加函数;因此它包含在匿名函数中
答案 1 :(得分:0)
var fn = foo;
出了什么问题?除了用于调试目的之外,您永远不需要将函数转换为字符串。
答案 2 :(得分:-1)
虽然我显然不了解你的完整背景,但我倾向于同意你可能永远不需要像这样在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]);
}
显然,您可以使用您的函数定义的任何范围(如果适用)替换上面的window
。