我正在尝试为学生提供一个网站,使他们能够输入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输出时,passed的值正确显示,“ 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实际上是适当选择的极少数情况之一。 new Function()也用另一个名称评估。并且,当然,您至少需要在它周围进行try..catch来捕获输入中的语法错误。

07-24 09:47
查看更多