使用esprima解析文件时出现解析错误,当使用r.js优化js文件时。

10

我正在使用r.js将多个js文件优化成一个。之前都很正常。最近,我修改了一些js代码,添加了如下代码:

var x = 08;

然后它显示:

错误:使用 Esprima 解析文件 D://webroot/js/a.js 时出现错误

错误:第45行:非预期的标记 ILLEGAL。

第45行是我添加了 var x = 08 的位置,09 也会显示错误。似乎以0开头,同时包含 89 的数字是不合法的。也许它们被视为八进制数..?

如何让 r.js 忽略此点并仍然优化 js 文件?


2
看起来是r.js中的一个(小)bug,你可以尝试在项目的GitHub页面上报告它。不过,你为什么要在数字前加零呢?最简单的解决方法就是不这样做... - kryger
4个回答

15

我曾经也遇到过同样的问题。

结果发现只是在要求文件时出现了双逗号。例如:

define([
 'file1',
 'file2',
 'file3',,
 'file4'

希望这能有所帮助。


2
这个对我有用!我盯着文件看了很久,甚至没有注意到,直到我读到这个!谢谢! - KOGI
2
天啊,我简直不敢相信我花了这么多小时才找到你的答案。 - ffflabs

5
由于 r.js 内部使用Esprima,所以出现了错误。要复制该问题,您可以转到此页面并输入var x = 08;
一般来说,JavaScript解释器会将具有前导零且可以解释为八进制数字的数字视为八进制数字,但如果无法将其解释为八进制数字(例如08),则将其视为十进制数字。
我已经用Node.js进行了测试,并得出了这个结果:
$ node
> 07
7
> 08
8
> 09
9
> 010
8
> 

还有更有趣的是:

> (function () {'use strict'; var x = 08;})()
undefined
> (function () {'use strict'; var x = 012;})()
SyntaxError: Octal literals are not allowed in strict mode.
[ ... traceback deleted ...]

启用严格模式后,八进制是非法的。

在JavaScript中,我会避免使用八进制,并且永远不会在数字前面加零。


0

当我在一个 require js 模块中忘记了一行 if 语句里的问号时,我也遇到了同样的错误。

错误的代码行:

var check = self.currentScroll() > self.lastScroll() ? 1 : self.currentScroll() < self.lastScroll() -1 : 0

更正:

var check = self.currentScroll() > self.lastScroll() ? 1 : self.currentScroll() < self.lastScroll() ? -1 : 0

0

我也曾遇到过同样的问题,在解析一个非常长的字符串时:

var styleHTML = "<style>....</style>"

原来在字符串中我还包含了一些注释,就像这样:

/* ... */

当我删除字符串中的所有CSS注释时,它就可以工作了!

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接