当我指定一个函数作为参数时,console.log()返回undefined

时间:2014-06-26 19:37:34

标签: javascript jquery function return-value

我试图为学生创建一个网站,允许他们输入javascript,运行代码,并根据预期的输出测试代码。 我在使用Function()构造函数运行从文本输入空间获取的代码时遇到了一些麻烦。

按下按钮以运行submitcode()

  function submitcode(){
    $(document).find('textarea,:text').each( function(){
      var codewritten = $(this).val();
      console.log(codewritten);
      test(codewritten);
    });
  }

测试方法在这里:

  function test(inputcode){
    var passed = inputcode; //code that they wrote
    var args = 'pogchamp'; //this is my input that i want to test their code with
    var f = new Function('a',passed);
    console.log(passed);
    console.log('test');
    console.log(f(args));
  }

当我检查chrome输出时,pass的值会正确显示,而' test',而console.log(f(args));返回undefined。

以下是传递变量的示例值,仅供参考:

   function foo(str){
       return false; //auto-generated
   }

谢谢,抱歉(我对javascript相对较新)

2 个答案:

答案 0 :(得分:2)

new Function()使用给定内容创建一个新函数。您正在向它传递函数声明,因此生成的函数如下所示:

function( a ) {
    function foo(str){
        return false; //auto-generated
    }
}

......当被叫时,什么都不返回。 (您可以使用console.log(f.toString())确认。

要解决此问题,您可以改为使用eval()

eval( "var f = " + passed );

对于所有不可避免的事情,eval是邪恶的!"评论:这是eval实际上是合适选择的罕见情况之一。 new Function()也是另一个名字的eval。当然,你需要至少 try..catch来捕捉输入中的语法错误。

答案 1 :(得分:0)

以下是Function()构造函数:

new Function ([arg1[, arg2[, ...argN]],] functionBody);

代码的问题在于函数体。看起来对于提供的样本,这将是结果:

(function( a ) {
    function foo(str) {
        return false;
    }
})( args );

哪个正确返回undefined,因为外部函数不会返回任何内容,即使内部函数没有。

JSFIDDLE DEMO

根据给定here的示例,除非您计划在外部(新函数)内调用函数体,否则函数体不应该是函数:

JSFIDDLE DEMO

  

//示例可以直接在JavaScript控制台中运行

     

//创建一个带有两个参数并返回总和的函数   那些参数var adder = new Function(“a”,“b”,“return a + b”);

     

//调用函数加法器(2,6); //> 8