"예기치 않은 토큰 불법"에 대한 눈에 띄는 원인이 없음


270

콘솔에서이 JavaScript 오류가 발생합니다.

잡히지 않은 구문 오류 : 예기치 않은 토큰 불법

이것은 내 코드입니다.

var foo = 'bar';​

보시다시피 매우 간단합니다. 구문 오류가 어떻게 발생합니까?


9
향후 독자 : Vagrant를 사용할 때이 오류가 발생하면이 답변도 도움이 될 수 있습니다. stackoverflow.com/questions/9479117/…
OZ_

WordPress에서이 문제가 발생하면 functions.php에서 스크립트를 큐에 넣으십시오. 템플릿에서 직접 JS를 호출하는 특정 템플릿이 있습니다. wp_head 또는 wp_footer에서 조건부 큐로 전환하면이 문제가 해결되었습니다.
Alpesh Shah

7
사회자 주 : 나는 실제로 질문에 대답하지 않는 많은 답을 삭제했습니다. 이것은 반복 하지 않습니다 . JavaScript에서 할 수있는 모든 가능한 일을 나열하여이 오류를 일으킬 수있는 곳 은 아닙니다 . 질문에는 그러한 시나리오를 포함하지 않는 매우 구체적인 상황이 있으며 모든 예제는 단순히 질문에 대답 하지 않습니다 .
animuson

3
와우, SO 경찰은이 질문으로 현장 하루를 보냈습니다. 다행히도 관련 정보 중 일부가 삭제 된 답변에 계속 표시됩니다.
cdonner

답변:


493

오류

JavaScript 인터프리터가 코드를 구문 분석하면 "토큰"이라는 조각으로 나뉩니다. 토큰을 네 가지 기본 토큰 유형 중 하나로 분류 할 수없는 경우 대부분의 구현에서 "ILLEGAL"이라는 레이블이 지정되며이 오류가 발생합니다.

예를 들어, 불량 @문자, 잘못 배치 된 중괄호, 대괄호, "스마트 따옴표", 작은 따옴표가 제대로 묶이지 않은 (예 : 등 this.run('dev1)) js 파일을 실행하려고하면 동일한 오류가 발생합니다 .

다양한 상황에서이 오류가 발생할 수 있습니다. 그러나 구문 오류나 잘못된 문자가없는 경우 보이지 않는 잘못된 문자 로 인해 발생할 수 있습니다 . 이것이이 답변에 관한 것입니다.

그러나 나는 불법적 인 것을 볼 수 없습니다!

세미콜론 바로 뒤에 코드에 보이지 않는 문자가 있습니다. 그것은이다 유니 코드 U+200B제로 폭 공간 문자 (일명 ZWSP, HTML 엔티티 ​). 이 문자는 Unexpected token ILLEGALJavaScript 구문 오류 를 일으키는 것으로 알려져 있습니다 .

그리고 어디에서 왔습니까?

확실히 말할 수는 없지만 내 베팅은 jsfiddle 입니다. 거기에서 코드를 붙여 넣으면 하나 이상의 U+200B문자 가 포함될 가능성이 큽니다 . 도구가 해당 문자를 사용하여 긴 문자열에서 단어 줄 바꿈을 제어하는 ​​것 같습니다.

업데이트 2013-01-07

최신 후 jsfiddle 갱신 , 빨간 점으로 지금 문자를 보여주는 것 codepen 같습니다 않습니다. 분명히U+200B 더 이상 문자를 삽입하지 않으므로이 문제는 지금부터 덜 빈번하게 발생합니다.

업데이트 2015-03-17

VirtualBox 의 버그로 인해 Vagrant 가 때때로이 문제를 일으키는 것으로 보입니다 . 이 블로그 게시물에 따른 해결책 은 sendfile off;nginx 구성에서 설정하거나 EnableSendfile OffApache를 사용하는 경우입니다.

또한 됐어요 보고 Chrome 개발자 도구에서 붙여 넣은 코드는 문자를 포함 할 수 있지만 현재 버전 (OSX에 22.0.1229.79)과 그 재현 할 수 없습니다.

어떻게 알 수 있습니까?

등장 인물은 보이지 않습니다. 어떻게 존재하는지 어떻게 알 수 있습니까? 편집자에게 보이지 않는 문자를 표시하도록 요청할 수 있습니다. 대부분의 텍스트 편집기에는이 기능이 있습니다. 예를 들어, Vim은 기본적으로이를 표시하고 ZWSP표시는 <u200b>입니다. 온라인으로 디버깅 할 수도 있습니다. jsbin 은 문자를 코드 창에 빨간색 점으로 표시하지만 페이지를 저장하고 다시로드 한 후에는 문자를 제거하는 것으로 보입니다. CodePen.io는 점으로 표시하고 저장 한 후에도 유지합니다.

관련 문제

그 캐릭터는 나쁜 것이 아니며 실제로 매우 유용 할 수 있습니다. Wikipedia의이 예제 는 긴 문자열을 다음 줄에 줄 바꿈하는 위치를 제어하는 ​​데 사용하는 방법을 보여줍니다. 그러나 마크 업에서 캐릭터의 존재를 모르는 경우 문제가 될 수 있습니다. 문자열 안에 (예를 들어, nodeValue보이는 내용이없는 DOM 요소의) 문자열이 있으면 실제로 문자열이 비어있을 때 (적용한 후에도 String.trim) 비어있을 것으로 예상 할 수 있습니다 .

ZWSP예를 들어 두 <div>요소 사이에서 발견되는 경우와 같이 HTML 페이지에 추가 공백이 표시되도록 할 수도 있습니다 ( 이 질문에 나와 있음 ). 이 경우 jsfiddle에서도 재현 할 수 없습니다. 문자가 무시되기 때문입니다.

또 다른 잠재적 인 문제 : 웹 페이지의 인코딩이 UTF-8로 인식되지 않으면 문자가 실제로 표시 될 수 있습니다 ( ​예 : latin1).

경우 ZWSPCSS 코드 (인라인 코드, 또는 외부 스타일 시트)에 존재하는 어떤 스타일이 적용되지 않도록 (에서와 같이, 스타일도 제대로 해석 할 수없는 이 질문에 ).

ECMAScript 사양

ECMAScript Specification (버전 35.1 ) 에서 특정 문자에 대한 언급을 찾을 수 없습니다 . 현재 버전 은 7.1 절 에서 비슷한 문자 ( U+200CU+200D)를 언급 하는데, "주석, 문자열 리터럴 및 정규 표현식 리터럴 외부"인 경우 에는 s 로 취급되어야한다고 말합니다 . 이러한 문자는 예를 들어 변수 이름의 일부일 수 있습니다 ( 실제로는 작동).IdentifierPartvar x\u200c;

7.2 절 에는 유효한 공백 문자 (예 : 탭, 공백, 공백 없음 등)가 나열되어 있으며 다른 모든 유니 코드 "공백 구분 기호"(범주 "Z")는 공백으로 처리해야한다고 언급합니다. 필자는 아마도 이와 관련하여 사양을 논의하는 가장 좋은 사람은 아니지만 U+200B실제로 구현 (적어도 Chrome 및 Firefox)이 예기치 않은 것으로 취급하는 것처럼 보일 때 공백으로 간주되어야 하는 것으로 보입니다. 토큰 (또는 하나의 일부)으로 인해 구문 오류가 발생합니다.


codepen.io도이 문자를 표시하는 것으로 보입니다. VIM 및 VI, 메모장 ++도 표시합니다.
rlemon

감사합니다 @rlemon, 답변에 CodePen 예제를 추가했습니다. 좋은 사이트, 나는 그것에 대해 몰랐다.
bfavaretto

Chromium을 사용 하여이 SO 질문 에서 testTwo 클래스의 코드를 복사 / 붙여 넣는 동안이 문제에 부딪 쳤습니다 . 분명히 파서는 function키워드 의 구문 강조 표시를 숨겼습니다. "인쇄 할 수없는 모든 문자 강조 표시"FAQ 방법을 사용하여 강조 표시 할 때까지 Vim에서는 보이지 않았습니다. Ahh 32..127 범위의 문자 만 복사하는 방법이 있다면 너무 좋을 것입니다 (그러나 아마도 그 응용 프로그램이 있습니다 :))
ack

1
@bfavaretto, 편집 모드의 코드 스 니펫에서만. 질문의 본문이 아니라면 이것을 언급해야합니다. (Chrome 43.0.2357.124 m에서 테스트)
Fernando Leal

1
많은 텍스트 편집기에서 파일의 문자 인코딩을 전환 할 수 있습니다. 이것은 이와 같은 불쾌감을주는 캐릭터를 찾는 데 매우 유용합니다. 내 솔루션은 일시적으로 UTF-8에서 ANSI 인코딩으로 전환하고 잘못된 문자를 제거한 다음 다시 전환하는 것이 었습니다. Windows에서 프리웨어 메모장 ++를 사용했습니다. 편집 : "모든 문자 표시"에 대한 메모장 + + 옵션이 누락되었습니다. 같은 결과, 덜 번거 로움 : D
mbargiel

64

왜이 문제를 코드에서 찾고 있습니까? 복사하여 붙여도됩니다.

당신이 볼 수 있다면, 동기화 된 폴더에 파일을 저장 한 후 정확히 무슨 일이 일어나고 있는지- *****파일 끝 과 비슷한 것을 볼 수 있습니다. 코드와 전혀 관련이 없습니다.

해결책.

nginx방랑 상자에서 사용 하는 경우 -서버 구성에 추가하십시오.

sendfile off;

apache방랑 상자에서 사용 하는 경우 -서버 구성에 추가하십시오.

EnableSendfile Off;

문제의 원인 : VirtualBox Bug


6
당신은 말 그대로 내 하루를 구했습니다. 나는 저녁 내내 Nginx + Vagrant와 함께 어려움을 겪었습니다.
fradeve

2
나요 NOT 이 너무 많은,하지만 그것이 (나를 위해) 덕분에 올바른 해답이 될 것으로 기대합니다.
Charlotte

2
실제로, 그것은 작동을 멈췄습니다. 다시 여기에 여러 레이어의 심볼릭 링크가있어서 내가 할 수있는 것을 숨기지 못했습니다.
샬럿

고마워-난 nginx와 함께 방랑 상자에 있었다. 비슷한 아파치 설정 에서이 문제를 보았습니다.
Cameron

아파치 : EnableSendfile 끄기
jamlee

7

다른 문서 (예 : PDF)의 코드를 콘솔로 복사하여 실행하려는 경우에도 이러한 상황이 발생할 수 있습니다.

내가 읽고있는 Javascript 책에서 예제 코드를 실행하려고 시도했지만 콘솔에서 실행되지 않았다는 것에 놀랐습니다.

PDF에서 복사하면 코드에 예기치 않은 불법, 보이지 않는 문자가 생길 수 있습니다.


5

Mac에서 동일한 문제가 발생하여 Mac이 표준 따옴표를 잘못된 자바 스크립트 문자 인 곱슬 따옴표로 바꾸었기 때문에 발견되었습니다.

이 문제를 해결하려면 내 Mac의 시스템 환경 설정 => 키보드 => 텍스트 (탭) 설정을 변경해야합니다.


5

오류가 가리키는 줄 뒤에 끝나지 않은 문자열이있을 때 크롬 에서이 오류가 발생했습니다. 문자열을 닫은 후에 오류가 사라졌습니다.

오류가있는 예 :

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

2
차이점을 알아 내기 위해 두 가지 예에서 diff를 실행해야했고 일단 내가 한 후에는 내 자신의 문제를 즉시 알아 냈습니다.
벤 해롤드

3

nginx + uwsgi 설정 vagrant를 실행하는 경우 주요 문제는 일부 답변에서 언급 한 것처럼 파일 보내기와 함께 가상 상자 버그입니다. 그러나 그것을 해결하려면 nginx와 uwsgi에서 sendfile을 비활성화해야합니다.

  1. nginx.conf sendfile에서

  2. uwsgi 응용 프로그램 / 구성 --disable-sendfile


2

OS X를 실행할 때 파일 시스템은 HFS +를 지원하지 않는 하드 드라이브에있는 경우 기본적으로 모든 파일의 숨겨진 포크를 만듭니다. 때때로 (지금 나에게 일어난) JavaScript 엔진이 실행하려는 코드 대신 데이터 포크를 실행하려고 할 수 있습니다. 이런 일이 발생하면

SyntaxError: Unexpected token ILLEGAL

파일의 데이터 포크에 유니 코드 U + 200B 문자가 포함되기 때문입니다. 데이터 포크 파일을 제거하면 코드의 이진 데이터 포크 대신 스크립트가 실제 의도 된 코드를 실행하게됩니다.

. whatever :이 파일은 기본적으로 전체 HFS 파일 특성을 지원하지 않는 볼륨 (예 : ufs 볼륨, Windows 파일 공유 등)에서 생성됩니다. Mac 파일을 이러한 볼륨에 복사하면 데이터 포크가 파일의 일반 이름으로 저장되고 추가 HFS 정보 (리소스 포크, 유형 및 작성자 코드 등)는 두 번째 파일 (AppleDouble 형식)로 저장됩니다. ". "로 시작하는 이름으로 . (이 파일들은 물론 OS-X에 관한 한 보이지 않지만 다른 OS에는 보이지 않습니다. 때로는 성 가실 수도 있습니다 ...)


1

내 이유는 다음과 같습니다.

전에:

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

이것은 \u탈출구 입니다. Codepen 의 분석 JS를 사용하여 알아 냈습니다 .

후:

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

오류가 수정되었습니다.


0

나는이 같은 문제가 있었고 텍스트 문자열에 코드를 추가 할 때 enter 키를 쳤기 때문에 발생했습니다.

긴 텍스트 문자열이기 때문에 텍스트 편집기에서 스크롤하지 않고도 모든 텍스트를보고 싶었지만 enter 키를 누르면 문자열에 보이지 않는 문자가 추가되어 불법입니다. Sublime Text를 편집자로 사용하고있었습니다.


0

모든 공간 영역을 & nbsp로 변경했는데 문제없이 작동했습니다.

val.replace ( "", "& nbsp");

누군가에게 도움이되기를 바랍니다.


0

나는 더미에 하나 이상의 답변을 추가 할 것입니다. 이 문제는 인코딩으로 인해 발생할 수도 있습니다. utf8 인코딩이 안전한쪽에 있기를 원합니다. 일부 편집기는 기본적으로 utf16을 사용하여 문제를 일으킬 수 있습니다. 이를 테스트하는 빠른 방법 중 하나는 예를 들어 VS 코드에서 단순히 동일한 내용을 다시 작성하지만 vscode의 로컬 편집기를 사용하여 파일을 작성하는 것입니다. 이것이 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.