【问题标题】:Checking if code is valid JavaScript without actually evaluating it检查代码是否是有效的 JavaScript 而不实际评估它
【发布时间】:2013-02-26 07:34:40
【问题描述】:

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

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

没有副作用。

【问题讨论】:

  • Javascript 不是编译语言。
  • javascript的编译太他妈高了!
  • @Dokkat,你错过了一个地方。
  • new Function(code) 会在出现语法错误时抛出。当然,如果不实际执行代码,就无法检测到引用错误。
  • @Dokkat jslint.comjshint.com

标签: javascript compilation eval


【解决方案1】:

是的,有。

new Function(code);

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

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

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-23
      • 2015-01-13
      • 2020-12-14
      • 2013-02-24
      相关资源
      最近更新 更多