我试图为学生创建一个网站,允许他们输入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相对较新)
答案 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,因为外部函数不会返回任何内容,即使内部函数没有。
根据给定here的示例,除非您计划在外部(新函数)内调用函数体,否则函数体不应该是函数:
//示例可以直接在JavaScript控制台中运行
//创建一个带有两个参数并返回总和的函数 那些参数var adder = new Function(“a”,“b”,“return a + b”);
//调用函数加法器(2,6); //> 8