“Unexpected token ILLEGAL”没有明显原因

时间:2012-10-04 03:23:36

标签: javascript syntax-error illegal-characters

我在我的控制台上收到此JavaScript错误:

  

未捕获的SyntaxError:意外的标记ILLEGAL

这是我的代码:

var foo = 'bar';​

你可以看到它非常简单。怎么会导致语法错误?

10 个答案:

答案 0 :(得分:492)

错误

当JavaScript解释器解析代码时,它会被分成称为“令牌”的片段。当令牌无法归类为four basic token types之一时,在大多数实现中都会标记为“ILLEGAL”,并抛出此错误。

例如,如果您尝试运行带有流氓@字符,错位的大括号,括号,“智能引号”,单引号未正确包含的js文件(例如{ {1}})等等。

  

许多不同的情况都可能导致此错误。但是,如果您没有任何明显的语法错误或非法字符,则可能是由不可见非法字符引起的。这就是答案的答案。

但我看不出任何违法行为!

代码中有一个不可见的字符,就在分号后面。这是Unicode U+200B Zero-width space字符(a.k.a。this.run('dev1),HTML实体ZWSP)。已知该字符会导致​ JavaScript语法错误。

它是从哪里来的?

我无法确定,但我的赌注是jsfiddle。如果您从那里粘贴代码,则很可能包含一个或多个Unexpected token ILLEGAL个字符。似乎该工具使用该字符来控制长字符串上的自动换行。

  

更新2013-01-07

     

在最新的jsfiddle update之后,it's now showing the character as a red dot就像codepen一样。 显然,它也不再单独插入U+200B个字符,所以从现在开始这个问题应该不那么频繁了。

     

更新2015-03-17

     由于VirtualBox中存在错误,

Vagrant 似乎有时会导致此问题。根据{{​​3}},解决方案是在您的nginx配置中设置U+200B,如果您使用Apache,则设置为sendfile off;

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

我怎样才能发现它?

角色是看不见的,我们怎么知道它在那里?您可以要求编辑显示隐形字符。大多数文本编辑器都具有此功能。例如,Vim默认显示它们,EnableSendfile Off显示为ZWSP。您也可以在线调试它:reported在其代码窗格中将字符显示为红点(但似乎在保存并重新加载页面后将其删除)。 jsbin,保存后即可保留。

相关问题

这个角色并不坏,它实际上非常有用。 CodePen.io also displays it as a dot演示了它如何用于控制长字符串应该包装到下一行的位置。但是,如果您不知道角色在您的标记上的存在,它可能会成为一个问题。如果你有一个字符串(例如,没有可见内容的DOM元素的<u200b>),你可能希望这样的字符串为空,而实际上它不是(即使在应用{{1}之后})。

nodeValue还可以在HTML页面上显示额外的空格,例如,当它在两个String.trim元素之间找到时(如This example on Wikipedia所示)。这种情况甚至不能在jsfiddle上重现,因为那里的字符会被忽略。

另一个潜在问题:如果网页的编码未被识别为UTF-8,则可能实际显示该字符(例如,在latin1中为ZWSP)。

如果CSS代码(内联代码或外部样式表)中存在<div>,则样式也无法正确解析,因此某些样式不会被应用(如this question所示)

ECMAScript规范

我在ECMAScript规范(版本this question3)上找不到任何关于该特定字符的提及。当前版本在5.1上提到类似的字符(​ZWSP),表示在“评论之外,字符串文字和常规字符时,它们应被视为U+200C s表达文字“。例如,这些字符可以是变量名称的一部分(并且U+200D确实有效)。

Section 7.1列出了有效的空格字符(例如制表符,空格,不间断空格等),并且模糊地提到应该处理任何其他Unicode“空格分隔符”(类别“Zs”)作为白色空间。我可能不是讨论这方面规格的最佳人选,但在我看来IdentifierPart应该被认为是白色空间,实际上实现(至少Chrome和Firefox)似乎将它们视为意外的令牌(或其中一部分),导致语法错误。

答案 1 :(得分:63)

为什么要在代码中查找此问题?即便如此,如果它被复制了。

如果您可以看到,在同步文件夹中保存文件后发生了什么 - 您会在文件末尾看到类似*****的内容。它完全与您的代码无关。

<强>解。

如果您在vagrant box中使用nginx - 添加到服务器配置:

sendfile off;

如果您在vagrant box中使用apache - 添加到服务器配置:

EnableSendfile Off;

问题来源:VirtualBox Bug

答案 2 :(得分:7)

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

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

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

答案 3 :(得分:5)

我在我的Mac上遇到了同样的问题,发现这是因为Mac正在使用非法javascript字符的引号替换标准引号。

要解决这个问题,我必须更改我的Mac上的设置系统首选项=&gt;键盘=&gt;文本(选项卡)取消选中使用智能引号和短划线(默认已选中)。

答案 4 :(得分:3)

如果您正在运行nginx + uwsgi setup vagrant,那么主要问题是一些回答中提到的带有send文件的虚拟框错误。但是要解决它,你必须在nginx和uwsgi中禁用sendfile。

  1. 在nginx.conf中 发送文件关闭

  2. uwsgi application / config - 禁用的sendfile

答案 5 :(得分:2)

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

SyntaxError: Unexpected token ILLEGAL

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

  

无论如何:这些文件是在本机上不支持完整HFS文件特征的卷上创建的(例如ufs卷,Windows文件共享等)。当Mac文件被复制到这样的卷时,其数据分叉存储在文件的常规名称下,并且附加的HFS信息(资源分叉,类型和创建者代码等)存储在第二个文件中(以AppleDouble格式),名称以&#34;。&#34;开头。 (就OS-X而言,这些文件当然是不可见的,但对于其他操作系统来说却不可见;这有时会令人烦恼......)

答案 6 :(得分:1)

这是我的理由:

之前:

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

\u是一个逃脱,我通过使用Codepen分析JS来解决这个问题。

之后:

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

并修正错误

答案 7 :(得分:0)

我遇到了同样的问题,因为我在文本字符串中添加代码时遇到了回车键。

因为它是一长串文本,所以我想在不必在文本编辑器中滚动的情况下看到它,但是输入会在字符串中添加一个不可见的字符,这是非法的。我使用Sublime Text作为我的编辑器。

答案 8 :(得分:0)

我将所有空间区域更改为&amp; nbsp,就像那样,它没有问题。

  

val.replace(&#34;&#34;,&#34;&amp; nbsp&#34;);

我希望它有所帮助。

答案 9 :(得分:0)

我将再增加一个答案。也可能由于编码而发生此问题。您希望utf8编码是安全的。默认情况下,某些编辑器使用utf16,这可能会引起问题。一种快速的测试方法是,例如,在VS代码中,只需重新创建相同的内容,但使用vscode的本地编辑器即可创建文件。 希望对您有所帮助。

相关问题