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

检查代码是否是有效的JavaScript,而不实际评估它,javascript,compilation,eval,Javascript,Compilation,Eval,是否有一个函数可以测试代码段是否是有效的JavaScript,而不实际评估它?也就是说,相当于 function validate(code){ try { eval(code); } catch(err) { return false; } return true; }; 没有副作用。是的,有 new Function(code); 如果代码不是有效的Javascript,则抛出一个语法错误。(保证如果code不可解析,它将抛出异常) 注意:此代码段仅检查语法有效

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

function validate(code){
    try { eval(code); } 
    catch(err) { return false; }
    return true;
};
没有副作用。

是的,有

new Function(code);
如果代码不是有效的Javascript,则抛出一个语法错误。(保证如果
code
不可解析,它将抛出异常)

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

您可以使用

Esprima(Esprima.org)是一个高性能、标准兼容的ECMAScript解析器,用ECMAScript(也称为JavaScript)编写

特征

  • 完全支持ECMAScript 5.1(ECMA-262)
  • 合理的语法树格式,与Mozilla解析器AST兼容
  • 经过大量测试(>550个单元测试,100%的陈述覆盖率)
  • 可选跟踪语法节点位置(基于索引和行列)
  • 对ES6/Harmony的实验支持(模块、类、分解等)
您可以使用或作为安装,并从命令行在本地运行。有两个命令:
esparse
esvalidate
esvalidate
yields(给出上述在线语法验证器的示例):


为了完整起见,
esparse
生成了一个。

Javascript不是一种编译语言。Javascript的编译量太高了@Dokkat,您错过了一个位置。
如果出现语法错误,新函数(code)
将抛出。当然,如果不实际执行代码,就无法检测引用错误。@Dokkat和
$ 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