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?

psychotik
źródło
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.

amercader
źródło
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.

Roy Hyunjin Han
źródło
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.

cjstehno
źródło
+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
ErikE
źródło
@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

Josue Alexander Ibarra
źródło
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).

B Seven
źródło
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.

Muhd
źródło
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>
Tousif Jamadar
źródło
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.

Roland Bouman
źródło
0

IE7 ma problemy z tablicami obiektów

columns: [
{
  field: "id",
  header: "ID"
},
{
  field: "name",
  header: "Name" , /* this comma was the problem*/ 
},
...
Stefan Michev
źródło
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”

Kevin Audleman
źródło
0

Może masz obiekt mający metodę „konstruktor” i spróbuj ją wywołać.

Niels Steenbeek
źródło
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.

iDevGeek
źródło
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.


źródło
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.

hisenberg
źródło
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
        } 
    }
});
wiwi
źródło
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.

rayray
źródło
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

Lev Savranskiy
źródło
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'   
   }
Kingy
źródło
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