检查代码是否是有效的JavaScript而不实际评估它

时间:2013-03-11 07:27:04

标签: javascript compilation eval

是否有一个函数可以测试代码片段是否是有效的JavaScript但没有实际评估它?也就是说,相当于

function validate(code){
    try { eval(code); } 
    catch(err) { return false; }
    return true;
};

没有副作用。

2 个答案:

答案 0 :(得分:11)

是的,有。

new Function(code);
如果代码无效,则

抛出SyntaxError Javascript。 (ECMA-262, edition 5.1, §15.3.2.1保证如果code无法解析,它将抛出异常。)

注意:此代码段仅检查语法有效性。例如,由于未定义的引用,代码仍然可以抛出异常。检查它是一种更难的方法:你要么应该评估代码(并获得它的所有副作用),要么解析代码并模拟它的执行(即在JS中编写JS虚拟机)。

答案 1 :(得分:2)

您可以使用esprima

  

Esprima(esprima.org)是一个高性能,符合标准的ECMAScript解析器,用ECMAScript(也称为JavaScript)编写。

     

功能

     
      
  • 完全支持ECMAScript 5.1(ECMA-262)
  •   
  • 明智的语法树格式,与Mozilla Parser AST兼容
  •   
  • 经过大量测试(> 550单位测试,100%声明覆盖率)
  •   
  • 语法节点位置的可选跟踪(基于索引和行列)
  •   
  • ES6 / Harmony的实验支持(模块,类,解构......)
  •   

您可以使用online syntax validator或将其安装为npm package并从命令行在本地运行它。有两个命令:esparseesvalidateesvalidate得出(给出上面在线语法验证器的例子):

$ esvalidate foo.js 
foo.js:1: Illegal return statement
foo.js:7: Octal literals are not allowed in strict mode.
foo.js:10: Duplicate data property in object literal not allowed in strict mode
foo.js:10: Strict mode code may not include a with statement

为了完整起见,esparse会产生AST