没有可见的原因为“意外标记非法”

我的控制台上出现这个JavaScript错误:

未捕获的SyntaxError:意外的标记非法

这是我的代码:

var foo = 'bar';​ 

这是非常简单的,你可以看到。 它怎么会造成语法错误?

错误

当JavaScript解释器parsing代码时,它会被分解为“令牌”。 当令牌不能被分类到四种基本令牌types中的一种时 ,它在大多数实现上被标记为“ILLEGAL”,并且引发该错误。

例如,如果你尝试运行带有@angular色的stream氓@js文件,错误的大括号,括号,“智能引用”,单引号没有正确包含(例如this.run('dev1) )等等。

许多不同的情况可能会导致这个错误。 但是,如果您没有任何明显的语法错误或非法字符,可能是由一个不可见的非法字符造成的。 这就是这个答案的意思。

但是我看不出任何非法的东西!

代码中有一个不可见的字符,分号后面。 它是Unicode U+200B零宽度空间字符(又名ZWSP ,HTML实体)。 已知该字符会导致非Unexpected token ILLEGAL JavaScript语法错误。

它从哪里来的?

我无法确定,但我的赌注是在jsfiddle 。 如果您从那里粘贴代码,则很可能会包含一个或多个U+200B字符。 看来这个工具使用这个字符来控制长string的换行。

更新2013-01-07

在最新的jsfiddle更新之后 , 它现在将字符显示为像codepen 那样的红点 。 显然 ,它也不是自己插入U+200B字符,所以这个问题从现在开始应该不那么频繁。

UPDATE 2015-03-17

stream浪似乎有时也会导致这个问题,由于在VirtualBox中的错误。 解决scheme,根据这个博客文章是sendfile off; 在您的nginxconfiguration中,或者如果您使用Apache,则EnableSendfile Off

另据报道 ,Chrome开发人员工具粘贴的代码可能包含该字符,但我无法使用当前版本(OSX上的22.0.1229.79)重现该代码。

我怎么能发现它?

angular色是不可见的,我们怎么知道它在那里? 你可以要求你的编辑器显示不可见的字符。 大多数文本编辑器都有这个function。 例如,Vim默认显示它们,而ZWSP显示为<u200b> 。 您也可以在线debugging: jsbin在其代码窗格中将该字符显示为红点(但似乎在保存并重新加载页面后将其删除)。 CodePen.io也将其显示为一个点 ,并在保存后保留它。

相关的问题

那个angular色不是什么坏事,实际上可能相当有用。 维基百科上的这个例子演示了如何用它来控制长string应该被包装到下一行的位置。 但是,如果您不了解angular色出现在您的标记上,可能会成为问题。 如果你有一个string(例如,没有可见内容的DOM元素的nodeValue ),你可能会希望这个string是空的,实际上它不是(即使在应用String.trim )。

ZWSP也可能导致在HTML页面上显示额外的空白,例如当它在两个<div>元素之间find时(如在这个问题上看到的)。 这种情况在jsfiddle上是不可重现的,因为这里的字符被忽略。

另一个潜在的问题是:如果网页的编码不被识别为UTF-8,那么可能会显示字符(例如,以“latin1”的forms)。

如果ZWSP存在于CSS代码(内联代码或外部样式表)中,那么样式也不能被正确parsing,所以有些样式不能被应用(见这个问题 )。

ECMAScript规范

ECMAScript规范(版本3和5.1 )上的特定字符我找不到任何提及。 当前版本在7.1节提到类似的字符( U+200CU+200D ),它们表示在“注释,string和正则expression式文字之外”时,它们应该被当作IdentifierPart 。 例如,这些字符可能是variables名称的一部分(和var x\u200c;确实有效)。

第7.2节列出了有效的空白字符(如制表符,空格,不间断空格等),并隐约提到任何其他Unicode空格分隔符(类别“Zs”)应被视为空格。 在这方面,我可能不是讨论规范的最佳人选,但在我看来, U+200B应该被认为是空白的,实际上,实际上(至lessChrome和Firefox)似乎对待它们作为一个意外的标记(或其中的一部分),导致语法错误。

为什么你find这个问题到你的代码? 甚至,如果它是copypasted。

如果你可以看到,在同步文件夹中保存文件后发生了什么 – 你将在文件末尾看到类似*****东西。 这根本不涉及你的代码。

解。

如果你在stream浪汉中使用nginx – 添加到服务器configuration:

 sendfile off; 

如果你在stream浪汉中使用apache – 添加到服务器configuration:

 EnableSendfile Off; 

问题来源: VirtualBox Bug

如果您将其他文档(如PDF)的代码复制到控制台并尝试运行,也可能发生这种情况。

我试图运行一些我正在阅读的Javascript书中的一些示例代码,并惊讶它没有在控制台中运行。

显然,从PDF中复制会在代码中引入一些意外的,非法的和不可见的字符。

当我在错误指向的行后面有一个未终止的string时,我在chrome中出现了这个错误。 closuresstring后,错误消失了。

错误示例:

 var file = files[i]; // SyntaxError: Unexpected token ILLEGAL jQuery('#someDiv').innerHTML = file.name + " (" + formatSize(file.size) + ") " + "<a href=\"javascript: something('"+file.id+');\">Error is here</a>"; 

没有错误的例子:

 var file = files[i]; // No error jQuery('#someDiv').innerHTML = file.name + " (" + formatSize(file.size) + ") " + "<a href=\"javascript: something('"+file.id+"');\">Error was here</a>"; 

我在我的Mac上有同样的问题,并发现这是因为Mac正在用非法JavaScript字符的curl引号replace标准引号。

要解决这个问题,我必须改变我的Mac上的设置系统偏好设置=>键盘=>文本(选项卡)取消选中使用智能报价和破折号(默认选中)。

如果你正在运行一个nginx + uwsgi setup vagrant,那么主要的问题就是在某些答案中提到的带有发送文件的虚拟盒子错误。 但是要解决这个问题,你必须禁用nginx和uwsgi中的sendfile。

  1. 在nginx.conf中closuressendfile

  2. uwsgi application / config –disable-sendfile

当运行OS X时,如果文件系统位于不支持HFS +的硬盘上,文件系统会创build基本上所有文件的隐藏分支。 这有时可能(刚刚发生在我身上)导致您的JavaScript引擎尝试运行数据分支,而不是您打算运行的代码。 发生这种情况时,您也将收到

 SyntaxError: Unexpected token ILLEGAL 

因为您的文件的数据分支将包含Unicode U + 200B字符。 删除数据分支文件将使您的脚本运行您的实际代码,而不是代码的二进制数据分支。

无论:这些文件是创build在本身不支持完整的HFS文件特征(如ufs卷,Windows文件共享等)的卷上。 当一个Mac文件被拷贝到这个卷中时,它的数据分叉被存储在文件的常规名字下,并且附加的HFS信息(资源分叉,types和创build者代码等)被存储在第二个文件中(AppleDouble格式)名称以“。开头 。 (就OS-X而言,这些文件当然是不可见的,但是对于其他操作系统来说,这些文件有时会令人讨厌…)

我有这个相同的问题,这是因为我添加了一个文本string中的代码时,输​​入密钥。

因为这是一串长长的文本,所以我不想在我的文本编辑器中滚动,但是按下回车键就给这个非法的string添加了一个不可见的字符。 我使用Sublime Text作为我的编辑器。

我改变了所有的空间区域,就像这样,它的工作没有问题。

val.replace(“”,“&nbsp”);

我希望它可以帮助别人。

这是我的理由:

之前:

 var path = "D:\xxx\util.s" 

这是一个逃生,我通过使用Codepen的分析JS计算出来。

后:

 var path = "D:\\xxx\\util.s" 

并修正了错误