如何在javascript中从字符串中获取函数?

时间:2013-04-26 14:54:41

标签: 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函数在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

3 个答案:

答案 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