“意外的标记非法”没有可见的原因
我的控制台上出现了这个JavaScript错误:
未捕获的SyntaxError:意外的令牌非法
这是我的代码:
var foo = 'bar';
错误
当代码由JavaScript解释器解析时,它会被分解成称为“令牌”的部分。 当令牌不能被分类到四种基本令牌类型中的一种时,它在大多数实现上被标记为“ILLEGAL”,并且引发该错误。
例如,如果您尝试运行带有流氓@
字符,错位大括号,括号,“智能引号”,单引号没有正确包含的js文件(例如this.run('dev1)
),则会引发同样的错误等等。
很多不同的情况都会导致这个错误。 但是,如果您没有任何明显的语法错误或非法字符,可能是由一个不可见的非法字符引起的。 这就是这个答案的意思。
但我看不到任何非法的东西!
代码中有一个不可见的字符,紧跟在分号后面。 它是Unicode U+200B
零宽度空间字符(又名ZWSP
,HTML实体​
)。 已知该字符会导致非Unexpected token ILLEGAL
JavaScript语法错误。
它从哪里来的?
我无法确定,但我的赌注是在jsfiddle。 如果您从那里粘贴代码,则很可能会包含一个或多个U+200B
字符。 似乎该工具使用该字符来控制长字符串上的单词换行。
更新2013-01-07
在最新的jsfiddle更新之后,它现在将字符显示为像codepen那样的红点。 显然,它也不会自己插入U+200B
字符,所以从现在起这个问题应该不那么频繁。
UPDATE 2015-03-17
由于VirtualBox中存在一个错误, 流浪似乎也会导致这个问题。 根据这篇博客文章,解决方案是sendfile off;
在您的nginx配置中,或者如果您使用Apache,则EnableSendfile Off
。
据报道,Chrome开发人员工具粘贴的代码可能包含该字符,但我无法使用当前版本(OSX上的22.0.1229.79)进行复制。
我怎么能发现它?
角色是不可见的,我们怎么知道它在那里? 你可以让你的编辑器显示不可见的字符。 大多数文本编辑器都具有此功能。 例如,Vim默认显示它们,而ZWSP
显示为<u200b>
。 您也可以在线调试它:jsbin在其代码窗格中将该字符显示为红点(但似乎在保存并重新加载页面后将其删除)。 CodePen.io也将其显示为一个点,并在保存后保留它。
相关问题
这个角色并不坏,它实际上可能非常有用。 维基百科上的这个例子演示了如何使用它来控制长字符串应该被包装到下一行的位置。 但是,如果您不知道角色出现在您的标记上,可能会成为问题。 如果你有一个字符串(例如,没有可见内容的DOM元素的nodeValue
),你可能会希望这样的字符串是空的,而实际上它不是(即使在应用String.trim
)。
ZWSP
还可能导致在HTML页面上显示额外的空白,例如,当它在两个<div>
元素之间找到时(如此问题所示)。 这种情况在jsfiddle中甚至不可重现,因为字符在那里被忽略。
另一个潜在的问题:如果网页的编码没有被识别为UTF-8,字符可能实际上被显示(如​
在latin1的,例如)。
如果ZWSP
存在于CSS代码(内联代码或外部样式表)中,那么样式也不能被正确解析,所以某些样式不会被应用(如这个问题所见)。
ECMAScript规范
我无法在ECMAScript规范(版本3和5.1)中找到任何提及的特定字符。 当前版本在7.1节提到了相似的字符( U+200C
和U+200D
),它们表示在“注释,字符串和正则表达式文字之外”时应将它们视为IdentifierPart
。 例如,这些字符可能是变量名称的一部分(和var xu200c;
确实有效)。
7.2节列出了有效的空格字符(如制表符,空格,不间断空格等),并隐约提到任何其他Unicode“空格分隔符”(类别“Zs”)应被视为空格。 在这方面,我可能不是讨论规范的最佳人选,但在我看来, U+200B
应该被视为白色空间,事实上,实际上(至少Chrome和Firefox)似乎对待它们作为意外的令牌(或其中的一部分),导致语法错误。
为什么你在代码中寻找这个问题? 甚至,如果它被拷贝了。
如果你可以看到,在同步文件夹中保存文件后会发生什么 - 你会在文件末尾看到类似*****
东西。 它根本与你的代码无关。
解。
如果你在流浪盒子中使用nginx
- 添加到服务器配置:
sendfile off;
如果你在流浪箱中使用apache
- 添加到服务器配置:
EnableSendfile Off;
问题来源:VirtualBox Bug
如果您将其他文档(如PDF)的代码复制到控制台并尝试运行,也会发生这种情况。
我试图从我正在阅读的Javascript书中运行一些示例代码,并且很惊讶它没有在控制台中运行。
显然,从PDF复制会在代码中引入一些意外的,非法的和不可见的字符。
链接地址: http://www.djcxy.com/p/9961.html