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

console.log() returns undefined when I specify a function as its argument

本文关键字:undefined 参数 console log 返回 函数 一个      更新时间:2023-09-26

我正在尝试为学生制作一个网站,允许他们输入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输出时,传递的值正确显示,'test'也是如此,而console.log(f(args));返回未定义。

下面是传递变量的样例值,仅供参考:
   function foo(str){
       return false; //auto-generated
   }

谢谢,对不起(我是相对较新的javascript)

new Function()用给定的内容创建一个新函数。你给它传递了一个函数声明,所以结果函数看起来像这样:

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

…调用该函数时,不返回任何值。(你可以用console.log(f.toString())来确认这一点)。

可以用eval()代替

eval( "var f = " + passed );

对于所有不可避免的"eval是邪恶的!!"注释:这是eval实际上是适当选择的少数情况之一。new Function()也用另一个名字来表示。当然,您至少需要 try..catch来捕获输入中的语法错误。

下面是Function()的构造函数:

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

代码的问题在于函数体。对于您提供的样品,结果如下:

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

正确返回undefined,因为外部函数没有返回任何东西,尽管内部函数返回了。

JSFIDDLE演示

根据这里给出的的例子,函数体不应该已经是一个函数,除非你打算在外部(新函数)中调用它:

<<p> JSFIDDLE演示/strong>

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

//创建一个函数,接受两个参数并返回var adder = new Function("a", "b", "return a + b");

//调用函数adder(2,6);//> 8