-1

考虑以下代码:

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

4

3 回答 3

2

这个怎么样

function foo()
{
    alert(1);
}

var str = foo.toString();

var fn = Function('return ' + str)(); 


console.log(fn.toString());

本质上 Function() 会尽量不污染全局范围,这就是为什么它在自己的范围内添加函数;因此它被包裹在一个匿名函数中

于 2013-04-26T15:04:36.920 回答
0

有什么问题var fn = foo;?除非出于调试目的,否则您永远不需要将函数转换为字符串。

于 2013-04-26T14:56:57.393 回答
-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定义您的函数的任何范围(如果适用)替换上面的内容。

于 2013-04-26T15:17:34.253 回答