자바 스크립트 오류의 가능한 경우 : '예상 식별자, 문자열 또는 숫자'


84

일부 사용자가 내 사이트에서 가끔 JS 오류를보고합니다. 오류 메시지는 "예상 식별자, 문자열 또는 번호"이며 줄 번호는 423725915입니다. 이는 임의의 숫자 일 뿐이며이 경우 각 보고서에 대해 변경됩니다. 이것은 대부분 IE7 / Mozilla 4.0 브라우저에서 발생합니다.

내 코드를 여러 번 스캔하고 jslint를 실행했지만 아무것도 선택하지 않았습니다.이 오류 메시지로 이어지는 일반적인 유형의 JS 문제를 아는 사람이 있습니까?


가장 먼저 떠오르는 것은 명백한 것입니다.
Anthony Forloney

끝에 매달린 쉼표가있는 배열 리터럴 일 수 있습니까? (또한 "Mozilla 4.0"은 무엇입니까?)
Pointy

userAgent 문자열에서 Mozilla 4.0 호환
psychotik

답변:


147

이러한 유형의 오류의 원인은 종종 개체 또는 배열 정의에서 잘못 배치 된 쉼표 일 수 있습니다.

var obj = {
   id: 23,
   name: "test",  <--
}

임의의 줄에 나타나는 경우 동적으로 만드는 개체 정의의 일부일 수 있습니다.


실종이었다. 이벤트 할당에서. 동적으로 생성 된 개체를 살펴 보는 단서가이를 파악하는 데 도움이되었습니다. jslint는 처음에 이것을 찾지 못했습니다. html 페이지의 일부로 인라인 js로 생성되었습니다. 고마워!
psychotik

2
아니에요. 대부분의 최신 브라우저는이 문제를 해결합니다. IE6 / 7은 그렇지 않습니다. 그리고 IE7 에뮬레이션 모드에서 IE8을 디버깅해도이를 포착하지 못합니다. (IE7에는 디버거가 없다는 것을 알고 있다고 생각합니다. IE7에서 VS를 사용하는 것도이 문제를 해결하지 못합니다). 말해 다음 그것을 시도하고)
psychotik

1
감사합니다! 분명히 이것은 Chrome과 같은 다른 브라우저에서는 문제가 아닙니다.
B Seven

5
정규식 ", \ s *]"및 ", \ s * \}"(따옴표 제외)를 사용하여 이러한 항목을 검색 할 수 있습니다. 많은 시간을 절약했습니다.
Gökhan Kurt

2
다음 ,\s*?\n?\s*?]과 같은 줄 바꿈이있는 자바 스크립트 정규식 : and,\s*?\n?\s*?\}
hayatbiralem

84

Javascript 사전에서 class 라는 단어를 키로 사용하면 class 가 Internet Explorer에서 예약 된 키워드 이기 때문에 두려운 "예상 식별자, 문자열 또는 숫자"오류가 발생할 수 있습니다.

나쁜

{ class : 'overlay'} // ERROR: Expected identifier, string or number

좋은

{'class': 'overlay'}

Javascript 사전에서 예약 된 키워드를 키로 사용하는 경우 키를 따옴표로 묶으십시오.

이 힌트가 지옥 디버깅의 하루를 절약하기를 바랍니다.


좋아, 나는이 문제로 몇 시간 동안 고생하고 있습니다. 지금 해결되었습니다.
John Prado

필요 이상으로이 자바 스크립트 라이브러리를 쳐다 보지 않게 해주셔서 감사합니다.
Khepri

1
나는 JSHint에 버그를 제출했습니다. 그들이 앞으로 이런 종류의 오류를 감지 할 수 있기를 바랍니다. github.com/jshint/jshint/issues/1000
travis

1
@travis 그들은 # 674 의 결과로 실제로 허용했습니다 :-)
cmbuckley 2013 년

3
나는 똑같은 오류가 있었지만 속성 "가져 오기"에 있습니다. 다음은 "예약어"전체 목록입니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Edgar Zagórski

11

사실 저는 최근에 IE에서 이와 같은 것을 얻었으며 JavaScript 구문 "오류"와 관련이있었습니다. IE를 제외한 모든 곳에서 괜찮 았기 때문에 따옴표로 오류를 말합니다. 이것은 IE6에서였습니다. 문제는 JSON 객체 생성 및 다음과 같은 추가 쉼표와 관련이 있습니다.

{ one:1, two:2, three:3, }

IE6는 3 이후의 쉼표를 정말 좋아하지 않습니다. 그런 식의 작은 구문 형식 문제를 찾을 수 있습니다.

네, 25 줄 JavaScript의 수백만 줄 번호도 흥미 롭다고 생각했습니다.

행운을 빕니다.


+1 많은 도움이되었습니다. 여분의 물음표는 나를 위해 ie8을 깨뜨리지 않았지만 ie7을 깨뜨 렸습니다.
Ivan Durst 2013

9

이것은 확실한 답이 아닙니다. 유혹적이지만 틀린 답을 제거하여 다른 사람들이 올바른 답을 찾을 수 있도록 도와줍니다.

디버깅이 문제를 강조하는 것처럼 보일 수 있습니다. 그러나 문제가 발생하는 유일한 브라우저는 IE이며 IE에서는 원본 문서의 일부인 코드 만 디버그 할 수 있습니다. 동적으로 추가 된 코드의 경우 디버거는 본문 요소를 현재 명령으로 표시하고 IE는 오류가 엄청난 줄 번호에서 발생했다고 주장합니다.

다음은 IE에서이 문제를 보여주는 샘플 웹 페이지입니다.

<html>
<head>
<title>javascript debug test</title>
</head>
<body onload="attachScript();">
<script type="text/javascript">
function attachScript() {
   var s = document.createElement("script");
   s.setAttribute("type", "text/javascript");
   document.body.appendChild(s);
   s.text = "var a = document.getElementById('nonexistent'); alert(a.tagName);"
}
</script>
</body>

이로 인해 다음과 같은 오류가 발생했습니다.

Line: 54654408
Error: Object required

@Protectorone 일시적으로 <script>태그 를 통해 문서 자체에 자바 스크립트를 로컬 또는로드 된 리소스로 넣습니다 . 디버그. 작업 스크립트로 다시 전환하십시오.
ErikE

5

내 응용 프로그램 중 하나에서 버그를 보았습니다. 포괄적으로 키워드와 동일한 모든 자바 스크립트 속성의 이름을 묶는 것을 잊지 마십시오.

다음과 같은 객체가있는 버그를 확인한 후이 버그를 발견했습니다.

var x = { class: 'myClass', function: 'myFunction'};

오류가 발생했습니다 (클래스 및 함수는 키워드 임) 따옴표를 추가하여 수정되었습니다.

var x = { 'class': 'myClass', 'function': 'myFunction'};

시간을 절약하고 싶습니다


나는 같은 문제에 부딪쳤다. 내 코드는 if(_features.delete){...}삭제가 키워드이기 때문에 오류를 일으키는 것과 같은 것을 사용하고 있습니다. stackoverflow.com/questions/26255/…
Snekse


2

앞서 언급했듯이 추가 쉼표가 있으면 오류가 발생했습니다.

또한 IE 7.0에서는 줄 끝에 세미콜론이 없으면 오류가 발생했습니다. Safari 및 Chrome에서 제대로 작동합니다 (콘솔에 오류 없음).


2

IE7은 최신 브라우저, 특히 Chrome보다 훨씬 덜 관대합니다. 나는 JSLint 를 사용 하여 이러한 버그를 찾는 것을 좋아합니다 . 다른 것들 중에서 부적절하게 배치 된 쉼표를 찾을 수 있습니다. 부적절한 공백을 무시하는 옵션을 활성화 할 수 있습니다.

부적절하게 배치 된 쉼표 외에도 누군가가보고 한 댓글 의이 블로그 에서 :

IE (7)에서만 "예상 식별자"라는 오류를 찾아 냈습니다. 내 조사를 통해이 페이지로 이동했습니다. 약간의 좌절 끝에 예약어를 함수명 ( "switch")으로 사용하는 문제가 발견되었습니다. 오류가 명확하지 않았고 잘못된 줄 번호를 가리 켰습니다.



1

이 오류는 배열 끝이나 함수 코드에서 쉼표를 제거하기 위해 추가하거나 누락했을 때 발생합니다. 이러한 오류에 대해서는 웹 페이지의 전체 코드를 관찰 할 필요가 있습니다.

Facebook API를 코딩하는 동안 Facebook 앱 코드에서 가져 왔습니다.

<div id='fb-root'>
    <script type='text/javascript' src='http://connect.facebook.net/en_US/all.js'</script>
    <script type='text/javascript'>
          window.fbAsyncInit = function() {
             FB.init({appId:'".$appid."', status: true, cookie: true, xfbml: true});            
             FB.Canvas.setSize({ width: 800 , height: 860 , }); 
                                                       // ^ extra comma here
          };
    </script>

0

이것은 src로 가져 와서 중간에로드 된 스크립트처럼 들리며 나머지는로드되지 않은 구문 오류 사인을 유발합니다.


0

IE7은 객체 배열에 문제가 있습니다.

columns: [
{
  field: "id",
  header: "ID"
},
{
  field: "name",
  header: "Name" , /* this comma was the problem*/ 
},
...

0

이 버그의 또 다른 변형 : 'continue'라는 함수가 있는데 예약어이기 때문에이 오류가 발생했습니다. 내 함수의 이름을 'continueClick'으로 변경해야했습니다.


0

아마도 당신은 '생성자'메소드를 가진 객체를 가지고 있고 그것을 호출하려고 할 것입니다.


0

Knockout JS를 사용하는 동안이 문제가 발생할 수 있습니다. 아래 예제와 같이 클래스 속성을 설정하려고하면 실패합니다.

<span data-bind="attr: { class: something() }"></span>

다음과 같이 클래스 문자열을 이스케이프합니다.

<span data-bind="attr: { 'class': something() }"></span>

내 2 센트.


0

저도이 문제를 접했습니다. 두 가지 해결책을 찾았습니다. 1). 위에서 언급 한 것과 동일하게 JSON 개체에서 추가 쉼표를 제거합니다. 2). 또한 내 JSP / HTML에는. 이 때문에 추가 쉼표에 대한 JS 오류를 제공하는 브라우저의 이전 모드를 트리거했습니다. 사용하면 브라우저의 HTML5 모드 (지원되는 경우)를 트리거하며 다른 브라우저 FF, Chrome 등과 마찬가지로 Extra Comma에서도 잘 작동합니다.


1
Stack Overflow에 오신 것을 환영합니다! 이것이 의미하는 바에 대한 예를 들어 주시겠습니까? "My JSP / HTML was having."
billrichards 2015-08-05

0

문제를 디버깅하는 쉬운 기술은 다음과 같습니다. 스크립트 / 코드를 콘솔에 반향합니다. 콘솔에서 IDE로 코드를 복사합니다. 대부분의 IDE는 코드에서 오류 검사를 수행하고 오류를 강조 표시합니다. JavaScript / HTML 편집기에서 거의 즉시 오류를 볼 수 있습니다.


0

다른 구성으로 동일한 문제가 발생했습니다. 이것은 각진 공장 정의에 있었지만 다른 곳에서도 발생할 수 있다고 가정합니다.

angular.module("myModule").factory("myFactory", function(){
    return
    {
        myMethod : function() // <--- error showing up here
        {
            // method definition
        } 
    }
});

수정은 매우 이국적입니다.

angular.module("myModule").factory("myFactory", function(){
    return { // <--- notice the absence of the return line
        myMethod : function()
        {
            // method definition
        } 
    }
});

0

이것은 클래스 내에서 아무데도 함수를 호출하는 경우 Typescript에서도 발생할 수 있습니다. 예를 들면

class Dojo implements Sensei {
     console.log('Hi'); // ERROR Identifier expected.
     constructor(){}
}

같은 함수 호출 console.log()은 함수 내부에 있어야합니다. 클래스 필드를 선언해야하는 영역이 아닙니다.


0

Windows 문제에 대한 Typescript

이것은 IE, chrome, FF에서 작동합니다.

export const OTP_CLOSE = { 'outcomeCode': 'OTP_CLOSE' };

이것은 chrome, FF에서 작동하며 IE 11에서는 작동하지 않습니다.

export const OTP_CLOSE = { outcomeCode: 'OTP_CLOSE' };

왠지 Windows 예약어와 관련된 것 같아요여기에 이미지 설명 입력


0

후행 쉼표 또는 일부가 아닌이 구문이 constants.js에서 사용 된이 오류가 발생했습니다.

    var titles = {
      [title.X]: 'X title',
      [title.Y]: 'Y title'
    }

IE 11은 이것을 전혀 좋아하지 않았습니다.

앞서 언급했듯이 이것은 사용하여 쉽게 수정되었지만

   var titles = {
     'title.X': 'X title',
     'title.Y': 'Y title'   
   }

2
이들은 동등한 표현이 아닙니다. 첫 번째는 title.X 및 title.Y 속성의 값을 titles 객체의 키로 사용하고 두 번째는 "title.X"및 "title.Y"문자열을 키로 사용합니다.
nabrown
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.