检查/验证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 中,是不是有更简单的方法来检查属性的属性是不是存在?