当前位置: 首页 > 知识库问答 >
问题:

“意外令牌非法”没有可见原因

南门新荣
2023-03-14

我在我的控制台上得到这个JavaScript错误:

未捕获的语法错误:意外令牌非法

这是我的代码:

var foo = 'bar';​

如你所见,这非常简单。它怎么会导致语法错误?

共有3个答案

慕佑运
2023-03-14

如果您正在将另一个文档(如PDF)中的代码复制到控制台并尝试运行它,也可能发生这种情况。

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

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

胡野
2023-03-14

为什么要在代码中查找此问题?即使是复制粘贴的。

如果你能看到,在同步文件夹中保存文件后到底发生了什么-你会在文件的末尾看到类似于*****的东西。它与你的代码完全无关。

解决方案

如果您使用的nginx在流浪者框-添加到服务器配置:

sendfile off;

如果您在vagrant框中使用的是apache,请添加到服务器配置:

EnableSendfile Off;

问题来源:VirtualBox Bug

鱼意远
2023-03-14

当JavaScript解释器解析代码时,它会被分解成称为“令牌”的片段。当一个令牌不能被分类为四种基本令牌类型中的一种时,在大多数实现中,它会被标记为“非法”,并抛出此错误。

例如,如果您试图运行一个js文件,其中包含一个恶意的@字符、一个放错位置的大括号、括号、“智能引号”、未正确括起的单引号(例如this.run('dev1))等等,则会出现相同的错误。

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

代码中有一个不可见字符,就在分号后面。它是UnicodeU 200B零宽度空格字符(又称ZWSP,HTML实体

我不能确定,但我打赌是jsfiddle。如果从那里粘贴代码,很可能包括一个或多个U200B字符。该工具似乎使用该字符来控制长字符串的换行。

更新2013-01-07

在最新的JSFIDLE更新之后,它现在将字符显示为一个红点,就像codepen一样。显然,它也不再单独插入u200b字符,所以从现在起,这个问题应该不会那么频繁了。

更新2015-03-17

由于VirtualBox中的一个bug,Vagrant有时也会导致此问题。根据这篇博文,解决方案是关闭sendfile ,或关闭EnableSendfile

还有报道称,从Chrome开发者工具粘贴的代码可能包含该字符,但我无法用当前版本(OSX上的22.0.1229.79)重现该字符。

角色是隐形的,我们怎么知道它在那里?您可以要求编辑器显示不可见的字符。大多数文本编辑器都具有此功能。例如,Vim默认显示它们,ZWSP显示为

这个角色并不是什么坏事,它实际上是非常有用的。Wikipedia上的这个例子演示了如何使用它来控制长字符串应该包装到下一行的位置。但是,如果您不知道标记上存在该字符,则可能会出现问题。如果它位于字符串内部(例如,没有可见内容的DOM元素的nodeValue),则可能期望该字符串为空,而实际上它不是空的(即使在应用string.trim)。

ZWSP还可能导致在HTML页面上显示额外的空白,例如在两个

另一个潜在的问题是:如果网页的编码没有被识别为UTF-8,字符实际上可能会被显示(例如,在latin1中,作为â€)。

如果CSS代码(内联代码或外部样式表)上存在ZWSP,样式也无法正确解析,因此无法应用某些样式(如本问题所示)。

我在ECMAScript规范(版本3和5.1)中找不到任何关于该特定字符的提及。当前版本在第7.1节中提到了类似的字符(U 200CU 200D),这表示当“在注释、字符串文本和正则表达式文本之外”时,它们应被视为标识符部分。例如,这些字符可能是变量名的一部分(并且var x\u200c;确实有效)。

第7.2节列出了有效的空白字符(如制表符、空格、无换行符等),并含糊地提到任何其他Unicode“空格分隔符”(类别“Zs”)应视为空白。我可能不是讨论这方面规范的最佳人选,但在我看来,u200b应该被视为空白,因为事实上,实现(至少是Chrome和Firefox)似乎将它们视为意外标记(或其中的一部分),导致语法错误。

 类似资料:
  • 问题内容: // if the box is outside the window, move it to the end function checkEdge() { var windowsLeftEdge = $(‘#window’).position().left; 我在上面提到的行上收到了UncaughtSyntaxError:意外的令牌ILLEGAL。它仅在GoogleChrome和Sa

  • 问题内容: 为什么每次我做时:- 它只是解析很好,但是当我这样做时:- 它给我一个错误,说:- 问题答案: 您要它解析JSON文本(不是)。那是无效的JSON,字符串必须用双引号引起来。 如果要与第一个示例等效:

  • 本文向大家介绍意外的令牌相关面试题,主要包含被问及意外的令牌时的应答技巧和注意事项,需要的朋友参考一下 您的JavaScript表示使用JSONP模式发出Ajax请求(这涉及将元素插入文档中而不是使用XMLHttpRequest)。 您得到的响应是一个XML文档,而不是遵循JSONP模式的JavaScript程序,它类似于: 因为浏览器试图将XML作为JavaScript执行(不是),您会收到错误

  • My HQL: 我收到以下错误: 我是HQL的新手。我想通过代码动态设置间隔值。我设置了等于比较的参数值。我读过http://www.mkyong.com/hibernate/hibernate-parameter-binding-examples/post,但我不知道在没有其他符号的情况下如何设置timeOffSet值。 斯纳克斯。 编辑: 我试过?及其工作良好,但我想用来实现这一点。

  • 我必须获得我的数据库(PostgreSQL)中的所有注册表,并使用不带大小写的。我试过使用标准,但ignoreCase()对我不起作用(我使用的是Hibernate3.6)。 我也尝试过使用ilike方法,但仍然不起作用。 这个版本也是: 因此,当我尝试在Hibernate中使用HQL创建查询时,会出现以下错误: 我的代码如下所示: 我做错了什么?

  • 我在使用Struts2和Hibernate时遇到了以下错误: 我有这个方法: folling代码定义类之间的关系: Contrat类: Paiement类: PeriodePay等级: 此查询在phpMyAdmin中工作良好;你能告诉我出了什么问题吗 编辑1: 我在试着别搞错了: 我在控制台中得到结果: 但是使用jsp我在数据表中得不到结果,也许我必须修复迭代器