2009-01-29 53 views
1

我目前正在开发一个教程网站,用于教授Web开发的基础知识(HTML,CSS和JavaScript,适用于初学者)。我希望有一个设置,可以深入介绍各种主题,然后提供一个基本的沙箱环境,用户可以编写代码解决每个教程部分末尾提出的问题。例如,如果我在前面的教程中介绍了乘法,并且用户刚刚完成了有关能够返回值的函数的课程,我可能会要求他们提交一个返回两个参数乘积的函数。这是否适合使用动态函数创建的情况?

这是不是完美实例中使用动态函数创建将被认为是一个好主意?我们来看一个例子。

<script> 
function check() 
{ 
eval('var f = ' + document.getElementById('user_code').value); 
if (f(5, 10) == 50) 
{ 
// user properly wrote a function which 
// returned the product of its parameters 
} 
} 
</script> 

这是不是一个坏主意?如果是这样,请解释。

回答

1

这听起来像是可以工作的。但是,您的环境中最大的挑战可能是错误处理。学生肯定会做出种种错误:

  • 编译时错误,将在eval()
  • 运行时错误被检测到,当你调用函数
  • 检测不到运行时的错误,将被检测,例如作为无限循环或堆栈溢出

更复杂的方法可能会将输入的JavaScript解析为解析树表示,然后将其与预期的解析树进行比较。如果不匹配,请指出可能出现的问题并让学生再次尝试。如果它匹配,那么你可以eval()并调用函数,知道它会做你期望的。

在Javascript中实现一个JavaScript的词法分析器和分析器将是具有挑战性的,但肯定不是不可能的。

1

听起来像你想要重拍Firebug甚至在IE8中新的开发工具。因此,我不得不说,从来没有一个有用的案例。如果这个网站上市,更不用说脚本注入的可能性。

+0

没有丝毫的帮助,队友... – 2009-01-29 01:55:18

1

只要您在封闭环境中操作此功能,就应该可以工作。 Eval为您提供代码注入攻击,所以我不会把它放在一个可公开访问的网站上,但是如果它完全包含在您的教室内,您应该没问题。

1

该代码可以工作,但如果语法或其他方面出现错误,该怎么办?也许使用try块来捕捉任何错误并将其显示给用户会有所帮助...

不知道这是否有帮助。

1

就你而言,我觉得这没有什么错。或者,您可以通过使用new Function()来先运行代码,然后运行它。理论上,这将分离“编译”和执行的阶段。然而eval将首先检查代码反正抛出错误:

var usercode = document.getElementById('user_code').value; 
try { 

    var f = new Function('a','b','return (' + usercode + ')(a,b);'); 
    if (f(5, 10)) { 
    // user properly wrote a function which 
    // returned the product of its parameters 
    } 
    else { 
    // user wrote code that ran but produced incorrect results 
    } 

} 
catch (ex) { 
    // user wrote something really bad 
} 

以这种方式与做事的问题是,抛出的异常可能是荒谬的。"foo;;=bar"将在括号中报告“丢失”错误,而eval将抛出propper语法错误。您可以通过(regexp)首先从用户代码抓取参数和正文,然后构建它。但是,这怎么会比eval好?

我认为你真正的问题将帮助用户避免隐式全局变量的陷阱。你将如何帮助用户避免编写仅在第二次运行时才运行的代码,因为全球首次被设置?您是否每次运行都不需要实施干净的沙箱?我会看看jsbin.com,firebug和类似工具如何处理这些事情。

我的感觉是,你应该现在用eval现在,如果需要出现问题,可以在以后更改为更精细的东西。

相关问题