Możliwe przypadki błędu JavaScript: „Oczekiwany identyfikator, ciąg lub liczba”


84

Niektórzy użytkownicy zgłaszają sporadyczne błędy JS w mojej witrynie. W komunikacie o błędzie jest napisane „Oczekiwany identyfikator, ciąg lub numer”, a numer linii to 423725915, który jest po prostu dowolną liczbą i zmienia się w przypadku każdego raportu w takim przypadku. Dzieje się tak głównie w przeglądarkach IE7 / Mozilla 4.0.

Skanowałem swój kod kilka razy i uruchomiłem jslint, ale nic nie wykryłem - czy ktoś wie o ogólnym typie problemów z JS, które prowadzą do tego komunikatu o błędzie?


Pierwsza rzecz, która przychodzi na myśl, jest oczywista.
Anthony Forloney

Czy może to być literał tablicowy, który ma na końcu wiszący przecinek? (Co to jest „Mozilla 4.0”?)
Pointy

Kompatybilny z Mozillą 4.0 w userAgent string
psychotik

Odpowiedzi:


147

Przyczyną tego typu błędu może być często niewłaściwie umieszczony przecinek w definicji obiektu lub tablicy:

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

Jeśli pojawia się w przypadkowej linii, być może jest częścią definicji obiektu, którą tworzysz dynamicznie.


to był brak; w przydziale wydarzenia. Wskazówka dotycząca spojrzenia na dynamicznie tworzone obiekty pomogła w tym. jslint nie znalazł tego początkowo, ponieważ został wygenerowany jako inline js jako część strony html. Dzięki!
psychotik

2
Nie, nie byłoby. Większość nowoczesnych przeglądarek naprawia to za Ciebie. IE6 / 7 nie. A debugowanie IE8 w trybie emulacji IE7 tego nie łapie. (Domyślam się, że wiesz, że IE7 nie ma debuggera - używanie VS z IE7 też tego nie łapie). Spróbuj, a potem powiedz mi;)
psychotik

1
Dziękuję Ci! Najwyraźniej nie stanowi to problemu w innych przeglądarkach, takich jak Chrome.
B Seven

5
Możesz wyszukiwać takie wystąpienia za pomocą wyrażeń regularnych ", \ s *]" i ", \ s * \}" (bez cudzysłowów). Zaoszczędził mi dużo czasu.
Gökhan Kurt

2
Regex dla javascript z ,\s*?\n?\s*?],\s*?\n?\s*?\}
podziałami

84

Używanie słowa class jako klucza w słowniku JavaScript może również wywołać przerażający błąd „Oczekiwany identyfikator, ciąg lub numer”, ponieważ klasa jest zastrzeżonym słowem kluczowym w programie Internet Explorer.

ZŁY

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

DOBRY

{'class': 'overlay'}

Używając zastrzeżonego słowa kluczowego jako klucza w słowniku JavaScript, należy ująć go w cudzysłów.

Mam nadzieję, że ta wskazówka pozwoli Ci zaoszczędzić dzień na debugowaniu piekła.


Niezłe, walczę z tym problemem godzinami. Teraz rozwiązany.
John Prado,

Dziękuję za uratowanie mnie przed gapieniem się w tę bibliotekę javascript dłużej niż to konieczne.
Khepri

1
Zgłosiłem błąd do JSHint, mam nadzieję, że będą w stanie wykryć tego rodzaju błędy w przyszłości: github.com/jshint/jshint/issues/1000
travis

1
@travis Pozwolili na to w wyniku # 674 :-)
cmbuckley

3
Wystąpił dokładnie ten sam błąd, ale we właściwości „import”. Oto pełna lista „Reserved Words” developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Edgar Zagórski

11

Właściwie ostatnio coś takiego dostałem na IE i było to związane z "błędami" składni JavaScript. Mówię błąd w cudzysłowach, ponieważ wszędzie było dobrze, ale w IE. To było w IE6. Problem był związany z tworzeniem obiektu JSON i dodatkowym przecinkiem, takim jak

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

IE6 naprawdę nie lubi tego przecinka po 3. Możesz poszukać czegoś takiego, drażliwych małych formalności składniowych.

Tak, pomyślałem, że wielomilionowy numer linii w moim 25-liniowym JavaScript też był interesujący.

Powodzenia.


+1 To mi bardzo pomogło. Dodatkowy znak zapytania nie złamał dla mnie ie8, ale złamał ie7.
Ivan Durst

9

To definitywna odpowiedź: wyeliminowanie kuszącej, ale błędnej odpowiedzi, aby pomóc innym kierować się w kierunku poprawnych odpowiedzi.

Może się wydawać, że debugowanie uwydatni problem. Jednak jedyną przeglądarką, w której występuje problem, jest IE, aw IE można debugować tylko kod, który był częścią oryginalnego dokumentu. W przypadku kodu dodawanego dynamicznie debugger po prostu pokazuje element body jako bieżącą instrukcję, a IE twierdzi, że błąd wystąpił w dużej liczbie linii.

Oto przykładowa strona internetowa, która zademonstruje ten problem w 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>

Dało mi to następujący błąd:

Line: 54654408
Error: Object required

@Protectorone Tymczasowo umieść javascript w samym dokumencie za pomocą <script>tagu, lokalnego lub jako załadowany zasób. Odpluskwić. Wróć do działającego skryptu.
ErikE

5

Właśnie zobaczyłem błąd w jednej z moich aplikacji, jako catch-all, pamiętaj o dołączeniu nazwy wszystkich właściwości javascript, które są takie same jak słowo kluczowe.

Znalazłem ten błąd po zajęciu się błędem, w którym obiekt taki jak:

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

wygenerował błąd (klasa i funkcja to słowa kluczowe), który został naprawiony przez dodanie cudzysłowów

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

Mam nadzieję, że zaoszczędzę Ci trochę czasu


Napotkałem ten sam problem. Mój kod używał czegoś podobnego, if(_features.delete){...}co powodowało błąd, ponieważ delete to słowo kluczowe. stackoverflow.com/questions/26255/…
Snekse


2

Jak wspomniano wcześniej, dodatkowy przecinek spowodował błąd.

Również w IE 7.0 brak średnika na końcu wiersza powodował błąd. Działa dobrze w Safari i Chrome (bez błędów w konsoli).


2

IE7 jest znacznie mniej wyrozumiały niż nowsze przeglądarki, zwłaszcza Chrome. Lubię używać JSLint, aby znaleźć te błędy. Znajdzie między innymi te nieprawidłowo umieszczone przecinki. Prawdopodobnie będziesz chciał aktywować opcję ignorowania niewłaściwych białych znaków.

Oprócz nieprawidłowo umieszczonych przecinków, na tym blogu w komentarzach ktoś zgłosił:

Wytropiłem błąd, który mówił tylko „Oczekiwany identyfikator” tylko w IE (7). Moje badania doprowadziły mnie do tej strony. Po pewnej frustracji okazało się, że problem polegał na tym, że użyłem zastrzeżonego słowa jako nazwy funkcji („przełącznik”). Błąd nie był jasny i wskazywał na zły numer wiersza.



1

Ten błąd występuje, gdy dodajemy lub nie usuwamy przecinka na końcu tablicy lub w kodzie funkcji. Konieczne jest obserwowanie całego kodu strony internetowej pod kątem takiego błędu.

Dostałem go w kodzie aplikacji na Facebooku, gdy kodowałem dla interfejsu API Facebooka.

<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

Brzmi to jak skrypt, który został pobrany za pomocą src i załadowany tylko w połowie, powodując błąd składni, sine reszta nie jest ładowana.


0

IE7 ma problemy z tablicami obiektów

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

0

Inna odmiana tego błędu: miałem funkcję o nazwie „continue”, a ponieważ jest to zarezerwowane słowo, zgłosiła ten błąd. Musiałem zmienić nazwę mojej funkcji na „continueClick”



0

Możesz napotkać ten problem podczas korzystania z Knockout JS. Jeśli spróbujesz ustawić atrybut klasy, tak jak w przykładzie poniżej, zakończy się to niepowodzeniem:

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

Wyjdź z ciągu klasy w następujący sposób:

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

Moje 2 centy.


0

Ja też spotkałem się z tym problemem. Poniżej znalazłem dwa rozwiązania. 1). Tak jak wspomnieli inni powyżej, usuń dodatkowy przecinek z obiektu JSON. 2). Również mój JSP / HTML miał. Z tego powodu uruchamiał stary tryb przeglądarki, który dawał błąd JS o dodatkowy przecinek. Kiedy jest używany, uruchamia tryb HTML5 przeglądarki (jeśli jest obsługiwany) i działa dobrze nawet z dodatkowym przecinkiem, tak jak każda inna przeglądarka FF, Chrome itp.


1
Witamy w Stack Overflow! Czy możesz podać przykład, co to oznacza: „Mój JSP / HTML działał”.
billrichards

0

Oto prosta technika usuwania problemu: wyślij echo skryptu / kodu do konsoli. Skopiuj kod z konsoli do swojego IDE. Większość IDE sprawdza kod i wyróżnia błędy. Powinieneś być w stanie zobaczyć błąd prawie natychmiast w edytorze JavaScript / HTML.


0

Miał ten sam problem z inną konfiguracją. Było to w kątowej definicji fabryki, ale zakładam, że może się to zdarzyć również w innym miejscu:

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

Poprawka jest bardzo egzotyczna:

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

0

Może się to również zdarzyć w Typescript, jeśli wywołasz funkcję w szczerym polu wewnątrz klasy. Na przykład

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

Wywołania funkcji, podobnie jak console.log()muszą znajdować się wewnątrz funkcji. Nie w obszarze, w którym powinieneś deklarować pola klas.


0

Problem z maszynopisem dla systemu Windows

Działa to w IE, Chrome, FF

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

Działa to w chrome, FF, nie działa w IE 11

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

Wydaje mi się, że jest to w jakiś sposób związane ze słowami zastrzeżonymi Windowswprowadź opis obrazu tutaj


0

Natknąłem się na ten błąd, w którym zamiast końcowego przecinka lub czegoś takiego, ta składnia została użyta w stałych.js

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

IE 11 wcale tego nie lubił.

Jak wspomniano wcześniej, można to łatwo naprawić za pomocą

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

2
To nie są równoważne wyrażenia. Pierwsza używa wartości właściwości title.X i title.Y jako kluczy w obiekcie titles, druga używa ciągów „title.X” i „title.Y” jako kluczy.
nabrown
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.