我正在尝试为学生提供一个网站,使他们能够输入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来捕获输入中的语法错误。