Javascript 为什么定义函数的字符串的求值返回undefined而不是函数?

Javascript 为什么定义函数的字符串的求值返回undefined而不是函数?,javascript,eval,Javascript,Eval,Chrome中的此代码将获得fct1为undefined。为什么?我希望fct1将是一个函数 问这个问题的原因是:您需要生成一个表达式 改变 function y(fct) { var a = 2; var fctStr = String(fct); var fct1 = eval(fctStr); console.log("fctStr=" + fctStr); // output: fctStr=function x() { return a + 1 } con

Chrome中的此代码将获得
fct1
undefined
。为什么?我希望
fct1
将是一个函数


问这个问题的原因是:

您需要生成一个表达式

改变

function y(fct) {
   var a = 2;
   var fctStr = String(fct);
   var fct1 = eval(fctStr);
   console.log("fctStr=" + fctStr); // output: fctStr=function x() { return a + 1 }
   console.log("fct1=");
   console.log(fct1);  // output: undefined.  Why it is undefined?  I expect fct1 is a function.
   return fct1();  // exception: undefined is not a function.
}
function x() { return a + 1 }
y(x)   // I expect it returns 3.  However, it throws exception at above "return fct1()" statement.


其他人的答案是零碎的,但以下是全部答案:

var fct1 = eval("("+fctStr+")");
它定义了一个名为
x
的函数,与以下内容非常相似:

function x() {return a + 1}
在这种情况下,将创建一个匿名函数并将其分配给变量
x
。因此,如果要将函数分配给变量,则
函数
()
之间不应存在标识符

如果希望
eval
语句返回函数,则需要将函数声明用括号括起来(而not为函数命名)编辑:函数名是可选的:

var x = function() {return a + 1}

在MDN文档中:“
eval()
返回最后一个计算表达式的值。”-如果没有表达式,则无需返回任何内容:)您的答案很好。非常感谢你。我读过这篇文章,“eval()返回最后计算的表达式的值”,但这并没有让我想到我需要执行这个eval(“+fctString+”),而不是eval(fctString)。我一定错过了什么。这是怎么一回事?或者,为什么var aa=eval(“函数x(){}”)返回未定义的值?但是var aa=eval(((function x(){})”)返回一个函数?我不知道确切的答案,但我想这是同样的原因,如果你写一个IIFE(立即调用的函数表达式),你需要在调用它之前把它包在括号里。是的,读一下“语句vs表达式”,然后读“函数表达式”@user2899992:如果函数定义(如
function foo(){}
)可以解析为函数声明或函数表达式,则它将解析为函数声明。你的情况就是这样。声明就像一个声明。使用分组运算符(
(…)
)强制将定义作为函数表达式进行计算。Hu?当函数表达式被命名时,它工作。根据我的回答,你可以用刚刚添加的parethesis来测试OP的代码。当我第一次尝试它时,它不起作用,但我一定是做了点什么;你是对的,它确实有效。我已经更新了我的答案。是否有文档告诉人们“function(){}”是语句字符串,而“(function(){})”是表达式字符串?var aa=function(){};将为var aa分配一个函数。这使人们认为“function(){}”是一个“表达式字符串”。但是,javascript将其视为“语句字符串”。我们需要使用“(function(){})”作为“表达式字符串”。
var x = function() {return a + 1}
var x = eval('(function () {return a + 1})');