检查/验证javascript语法的简单方法

Posted

技术标签:

【中文标题】检查/验证javascript语法的简单方法【英文标题】:Simple way to check/validate javascript syntax 【发布时间】:2013-03-18 18:32:06 【问题描述】:

我有一些不同的 javascript-sn-ps(几千个),其中一些在语法上有一些愚蠢的错误(例如不匹配的大括号/引号、javascript 中的 html、变量名中的拼写错误)。

我需要一种简单的方法来检查 JS 语法。我已经尝试过 JSLint,但它发送了太多关于样式、变量定义方式等的警告(即使我关闭了所有标志)。我不需要找出样式问题,或者提高 javascript 质量,我只需要找到明显的语法错误。当然,我可以简单地在浏览器/浏览器控制台中检查它,但我需要自动进行,因为该 sn-ps 的数量很大。

添加: JSLint/JSHint 报告了很多不是“美”而是工作的问题(即有一些潜在问题),并且看不到真正的问题,普通编译器只会报告语法错误并停止执行。例如,尝试 JSLint 代码,该代码在第 4 行(不匹配的引号)、第 6 行(需要逗号)和第 9 行(意外的

document.write('something');
a = 0;
if (window.location == 'http://google.com')  a = 1;
document.write("aaa='andh"+a+"eded"');
a = 
  something: ['a']
  something2: ['a']
;
<script>
a = 1;

【问题讨论】:

试试这个javascriptlint.com 嗯...谢谢,我会试试的。我认为它是 JSLint 的一些克隆,但它的工作方式不同。 【参考方案1】:

你可以试试JSHint,它不那么冗长。

【讨论】:

看起来很像 JSLint。【参考方案2】:

以防万一有人还在找你,你可以试试Esprima,

它只检查语法,没有别的。

【讨论】:

Esprima 似乎比 JsLint 更有用,至少它可以检测到例如丢失的括号。虽然它不与编辑器集成吗?【参考方案3】:

我发现 SpiderMonkey 能够编译脚本而不执行它,如果编译失败 - 它会打印错误。

所以我刚刚为 SpiderMonkey 创建了一个小包装器

sub checkjs 
    my $js = shift;
    my ( $js_fh, $js_tmpfile ) = File::Temp::tempfile( 'XXXXXXXXXXXX', EXLOCK => 0, UNLINK => 1, TMPDIR => 1 );
    $| = 1;
    print $js_fh $js;
    close $js_fh;
    return qx(js -C -f $js_tmpfile 2>&1);

而且 javascriptlint.com 在我的情况下也非常好。 (感谢@rajeshkakawat)。

【讨论】:

我认为问题在于他对它是否编译感兴趣,不一定(例如 SpiderMonkey insert semi-colons 吗?当然它不需要你声明变量,对吧?),但是有兴趣找到一些 JSLint 特别擅长捕捉的逻辑错误(如 var name 拼写错误)。 JSLint 不适合语法检查,它会报告一些小问题,但看不到真正糟糕和危险的事情。试试这个: document.write('something'); a = 0;如果 (window.location == 'google.com') a = 1; document.write("aaa='andh"+a+"eded"'); a = 某物:['a']某物2:['a']; a = 1;据我了解,SpiderMonkey 是 Firefox 中使用的 JS 引擎,所以 if 会像 Firefox 一样添加/不添加分号。 没有意识到这是您自己的答案!编译不会在名称等中找到拼写错误。创建一个与您想要报告的内容相匹配的 JSLint 子集将给您 exactly 您想要的东西,我认为,并且还会报告缺少分号,这可能会导致多文件缩小代码。 在实践中,在我的情况下,JSLint 错误报告有几兆字节的文本 - 阅读/修复需要数年时间 :) 一些脚本依赖于 3rd 方代码,所以真的很难理解如果某个变量因为拼写错误而被使用过一次,或者因为它是在其他地方声明的。一般来说,我使用 SpiderMonkey 发现了几十个语法问题,我几乎对它感到满意。我也会尝试 javascriptlint,并且可能会尝试过滤掉 JSLint 结果以忽略非关键问题(它将所有内容报告为“错误”:\)【参考方案4】:

如果您有一份您确实想要捕获的 JSLint 错误的详尽列表,还有很多选项。

JSLint 的代码实际上非常好并且相当容易理解(我假设您已经从您的问题中对 JavaScript 相当了解)。你可以破解它,只检查你想要的,不管它发现多少错误都继续。

您还可以在 Node.js 中快速编写一些内容,以按原样使用 JSLint 来快速检查每个文件/sn-p,并仅输出您关心的那些错误。

【讨论】:

查看我在初始帖子中添加的内容。【参考方案5】:

只需使用node --check filename

【讨论】:

【参考方案6】:

Semantic Designs(我的公司)的 JavaScript 格式化程序读取 JS 文件并对其进行格式化。你不想要格式化部分。

为了读取它将被格式化的文件,它使用了一个完整的 JavaScript 解析器,它会进行完整的语法检查(甚至在正则表达式中)。如果你运行它并忽略格式化的结果,你会得到一个语法检查器。

你可以给它一个大的文件列表,它会格式化所有的文件。您可以使用它来批量检查您的大集合。 (如果有任何语法错误,它会向 shell 返回一个非零错误状态)。

【讨论】:

1) 忘了说。平台是Linux,首选免费软件工具。 2)您的网站认为只有一个平台存在,很难找到您的软件在Windows上运行 1.很难回答您最初没有提供的要求。 2) 没那么难,请参阅购买页面链接。 3) 讨论在 Linux 上的 Wine 下运行软件,效果很好。

以上是关于检查/验证javascript语法的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaScript / jQuery 进行简单的数字验证

javascript异步提交有几种方法

Vim插件简单介绍

在 JavaScript 中,是不是有更简单的方法来检查属性的属性是不是存在?

检查 JavaScript 中是不是存在深度嵌套对象属性的最简单方法是啥? [复制]

JavaScript - 简单数据验证中的错误逻辑