Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从javascript中的字符串获取函数?_Javascript - Fatal编程技术网

如何从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]);
}