首页 文章

“Unexpected token ILLEGAL”没有明显原因

提问于
浏览
268

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

Uncaught SyntaxError:意外的令牌ILLEGAL

这是我的代码:

var foo = 'bar';​

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

10 回答

  • 489

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

    SyntaxError: Unexpected token ILLEGAL
    

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

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

  • 5

    我将所有空间区域更改为,就像那样,它没有问题 .

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

    我希望它对某人有帮助 .

  • 0

    为什么要在代码中查找此问题?甚至,如果它是复制的 .

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

    Solution.

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

    sendfile off;
    

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

    EnableSendfile Off;
    

    问题来源:VirtualBox Bug

  • 3

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

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

  • 2

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

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

    • uwsgi application / config --disable-sendfile

  • 5

    这是我的理由:

    之前:

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

    哪个 \u 是一个逃脱,我通过使用Codepen的分析JS来解决它 .

    后:

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

    并修复了错误

  • 1

    当我在错误指向的行之后有一个未终止的字符串时,我在chrome中出现了这个错误 . 关闭字符串后,错误就消失了 .

    错误示例:

    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>";
    
  • 0

    错误

    当JavaScript解释器解析代码时,会将其分解为名为"tokens"的片段 . 当令牌无法归类为four basic token types之一时,它会在大多数实现中标记为"ILLEGAL",并抛出此错误 .

    例如,如果您尝试使用流氓 @ 字符,错位的大括号,括号,"smart quotes",单引号未正确包含(例如 this.run('dev1) )等运行js文件,则会引发相同的错误 .

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

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

    在分号后面的代码中有一个不可见的字符 . 它是Unicode U+200B Zero-width space字符(a.k.a . ZWSP ,HTML实体 &#8203; ) . 已知该字符会导致 Unexpected token ILLEGAL JavaScript语法错误 .

    它来自哪里?

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

    更新2013-01-07在最新的jsfiddle更新之后,它现在将字符显示为像codepen一样的红点 . 显然,它也不再单独插入U 200B字符,所以从现在开始这个问题应该不那么频繁了 . 更新2015-03-17由于VirtualBox中的错误,Vagrant似乎有时会导致此问题 . 根据这篇博客文章的解决方案是关闭sendfile;在你的nginx配置中,或者如果你使用Apache,则启用EnableSendfile .

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

    我如何发现它?

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

    相关问题

    这个角色并不坏,它实际上非常有用 . This example on Wikipedia演示了它如何用于控制长字符串应该包装到下一行的位置 . 但是,如果您不知道角色在您的标记上的存在,它可能会成为一个问题 . 如果你有一个字符串(例如,没有可见内容的DOM元素的 nodeValue ),你可能希望这样的字符串为空,而实际上它不是(即使在应用 String.trim 之后) .

    ZWSP 也会导致在HTML页面上显示额外的空格,例如,当它在两个 <div> 元素之间找到时(如this question所示) . 这种情况甚至不能在jsfiddle上重现,因为那里的字符被忽略了 .

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

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

    ECMAScript规范

    我在ECMAScript规范(版本35.1)上找不到任何关于该特定字符的提及 . 当前版本在Section 7.1上提到类似的字符( U+200CU+200D ),表示在"outside of comments, string literals, and regular expression literals"时它们应被视为 IdentifierPart . 例如,这些字符可以是变量名称的一部分(并且 var x\u200c; 确实有效) .

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

  • 62

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

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

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

  • 7

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

    因为它是一长串文本我想看到它而不必在我的文本编辑器中滚动,但是命中输入为字符串添加了一个不可见的字符,这是非法的 . 我使用Sublime Text作为我的编辑器 .

相关问题