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

时间:2014-12-16 16:02:07

标签: javascript eval

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.

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

为什么要问这个问题的原因是:How to write function-y accepting parameter-fct_x which accesses var-a which is required to be defined in function-y?

2 个答案:

答案 0 :(得分:5)

您需要制作一个表达式。

更改

var fct1 = eval(fctStr);

var fct1 = eval("("+fctStr+")");

答案 1 :(得分:0)

其他人已经回答了一些问题,但这里是答案:

function x() {return a + 1}

它定义了一个名为x的函数,这与以下内容非常类似:

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

在这种情况下,会创建一个匿名函数并将其分配给变量x。因此,如果您想为变量分配函数,则不应该是function()之间的标识符。

如果您希望eval语句返回该函数,则需要用括号包装函数声明(并且给出功能名称)编辑:功能名称是可选的:

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