[javascript] “예기치 않은 토큰 불법”에 대한 눈에 띄는 원인이 없음

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

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

이것은 내 코드입니다.

var foo = 'bar';​

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



답변

오류

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)이 예기치 않은 것으로 취급하는 것처럼 보일 때 공백으로 간주되어야 하는 것으로 보입니다. 토큰 (또는 하나의 일부)으로 인해 구문 오류가 발생합니다.


답변

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

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

해결책.

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

sendfile off;

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

EnableSendfile Off;

문제의 원인 : VirtualBox Bug


답변

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

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

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


답변

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

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


답변

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

오류가있는 예 :

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


답변

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

  1. nginx.conf sendfile에서

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


답변

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

SyntaxError: Unexpected token ILLEGAL

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

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