是否有一个函数可以测试代码片段是否是有效的JavaScript但没有实际评估它?也就是说,相当于
function validate(code){
try { eval(code); }
catch(err) { return false; }
return true;
};
没有副作用。
答案 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并从命令行在本地运行它。有两个命令:esparse
和esvalidate
。 esvalidate
得出(给出上面在线语法验证器的例子):
$ 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。