5

是否有一个函数可以在不实际评估的情况下测试一个片段是否是有效的 JavaScript?也就是说,相当于

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

没有副作用。

4

2 回答 2

12

就在这里。

new Function(code);

抛出一个SyntaxErrorif 代码不是有效的 Javascript。(ECMA-262, edition 5.1, §15.3.2.1code保证如果不可解析它会抛出异常)。

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

于 2013-03-11T07:41:29.197 回答
2

你可以使用esprima

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

特征

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

您可以使用在线语法验证器或将其安装为npm 包并从命令行在本地运行它。有两个命令: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

于 2013-03-11T08:05:53.143 回答