Mögliche Fälle für einen Javascript-Fehler: "Erwartete Kennung, Zeichenfolge oder Nummer"

84

Einige Benutzer melden gelegentlich JS-Fehler auf meiner Website. Die Fehlermeldung lautet "Erwartete Kennung, Zeichenfolge oder Nummer" und die Zeilennummer lautet 423725915. Dies ist nur eine beliebige Nummer und ändert sich in jedem Fall, wenn dies auftritt. Dies geschieht hauptsächlich mit IE7 / Mozilla 4.0-Browsern.

Ich habe meinen Code ein paar Mal gescannt und jslint ausgeführt, aber es hat nichts gefunden - kennt jemand die allgemeine Art von JS-Problemen, die zu dieser Fehlermeldung führen?

Psychotik
quelle
Das erste, was mir in den Sinn kommt, ist das Offensichtliche.
Anthony Forloney
Könnte es ein Array-Literal sein, das am Ende ein baumelndes Komma hat? (Auch, was ist "Mozilla 4.0"?)
Pointy
Mozilla 4.0 kompatibel in der userAgent Zeichenfolge
Psychotik

Antworten:

147

Die Ursache für diesen Fehlertyp kann häufig ein falsch platziertes Komma in einer Objekt- oder Array-Definition sein:

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

Wenn es in einer zufälligen Zeile angezeigt wird, ist es möglicherweise Teil einer Objektdefinition, die Sie dynamisch erstellen.

Amercader
quelle
es fehlte; in einer Ereigniszuordnung. Der Hinweis auf dynamisch erstellte Objekte half dabei, dies zu erfassen. jslint hat dies anfangs nicht gefunden, da es als Inline-js als Teil einer HTML-Seite generiert wurde. Vielen Dank!
Psychotik
2
Nein, würde es nicht. Die meisten modernen Browser beheben dies für Sie. IE6 / 7 nicht. Das Debuggen von IE8 im IE7-Emulationsmodus fängt dies nicht ab. (Ich vermute, Sie wissen, dass IE7 keinen Debugger hat - die Verwendung von VS mit IE7 fängt dies auch nicht ab). Probieren Sie es aus und sagen Sie es mir dann;)
Psychotik
1
Danke dir! Anscheinend ist dies in anderen Browsern wie Chrome kein Problem.
B Seven
5
Sie können solche Vorkommen mit Regex ", \ s *]" und ", \ s * \}" (ohne Anführungszeichen) suchen. Hat mir viel Zeit gespart.
Gökhan Kurt
2
Regex für Javascript mit Zeilenumbrüchen wie ,\s*?\n?\s*?],\s*?\n?\s*?\}
folgt
84

Die Verwendung des Wortes Klasse als Schlüssel in einem Wörterbuch Javascript können auch die gefürchtete „Erwartete Bezeichner, Zeichenfolge oder Zahl“ Fehler auslösen , da Klasse ein reserviertes Schlüsselwort in Internet Explorer ist.

SCHLECHT

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

GUT

{'class': 'overlay'}

Wenn Sie ein reserviertes Schlüsselwort als Schlüssel in einem Javascript-Wörterbuch verwenden, schließen Sie den Schlüssel in Anführungszeichen ein.

Hoffe, dieser Hinweis erspart Ihnen einen Tag des Debuggens der Hölle.

Roy Hyunjin Han
quelle
Schön, ich habe stundenlang mit diesem Problem zu kämpfen. Jetzt gelöst.
John Prado
Vielen Dank, mein Herr, dass Sie mich davon abgehalten haben, länger als nötig auf diese Javascript-Bibliothek zu starren.
Khepri
1
Ich habe einen Fehler bei JSHint eingereicht, hoffentlich können sie diese Art von Fehlern in Zukunft erkennen: github.com/jshint/jshint/issues/1000
Travis
1
@travis Sie erlaubten es tatsächlich als Ergebnis von # 674 :-)
cmbuckley
3
Ich hatte genau den gleichen Fehler, aber auf Eigenschaft "Import". Hier ist eine vollständige Liste von "Reserved Words" developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Edgar Zagórski
11

Eigentlich habe ich so etwas kürzlich im IE bekommen und es hing mit der JavaScript-Syntax "Fehler" zusammen. Ich sage Fehler in Anführungszeichen, weil es überall außer im IE in Ordnung war. Dies war unter IE6. Das Problem hing mit der Erstellung von JSON-Objekten und einem zusätzlichen Komma zusammen, z

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

IE6 mag dieses Komma nach 3 wirklich nicht. Vielleicht suchen Sie nach so etwas, heiklen kleinen Problemen mit der Syntaxformalität.

Ja, ich fand die Anzahl von mehreren Millionen Zeilen in meinem JavaScript mit 25 Zeilen ebenfalls interessant.

Viel Glück.

cjstehno
quelle
+1 Das hat mir sehr geholfen. Das zusätzliche Fragezeichen hat für mich nicht ie8 gebrochen, sondern ie7.
Ivan Durst
9

Dies ist eine endgültige Nichtantwort: Eliminieren Sie eine verlockende, aber falsche Antwort, um anderen zu helfen, zu richtigen Antworten zu navigieren.

Es könnte so aussehen, als würde das Debuggen das Problem hervorheben. Der einzige Browser, in dem das Problem auftritt, ist der IE. Im IE können Sie nur Code debuggen, der Teil des Originaldokuments war. Bei dynamisch hinzugefügtem Code zeigt der Debugger nur das body-Element als aktuelle Anweisung an, und der IE behauptet, der Fehler sei in einer großen Zeilennummer aufgetreten.

Hier ist eine Beispielwebseite, die dieses Problem im IE demonstriert:

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

Dies ergab für mich den folgenden Fehler:

Line: 54654408
Error: Object required
ErikE
quelle
@Protectorone Fügen Sie das Javascript vorübergehend über ein <script>Tag in das Dokument selbst ein , entweder lokal oder als geladene Ressource. Debuggen. Wechseln Sie zurück zu Ihrem Arbeitsskript.
ErikE
5

Ich habe gerade den Fehler in einer meiner Anwendungen als Sammelbegriff gesehen. Denken Sie daran, den Namen aller Javascript-Eigenschaften anzugeben, die mit dem Schlüsselwort identisch sind.

Diesen Fehler gefunden, nachdem ein Fehler behoben wurde, bei dem ein Objekt wie:

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

erzeugte den Fehler (Klasse und Funktion sind Schlüsselwörter), der durch Hinzufügen von Anführungszeichen behoben wurde

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

Ich hoffe, Ihnen etwas Zeit zu sparen

Josue Alexander Ibarra
quelle
Ich bin auf das gleiche Problem gestoßen. Mein Code verwendete so etwas wie if(_features.delete){...}einen Fehler, da delete ein Schlüsselwort ist. stackoverflow.com/questions/26255/…
Snekse
2

Wie bereits erwähnt, hat ein zusätzliches Komma einen Fehler ausgelöst.

Auch in IE 7.0 verursachte das Fehlen eines Semikolons am Zeilenende einen Fehler. Es funktioniert gut in Safari und Chrome (ohne Fehler in der Konsole).

B Sieben
quelle
2

IE7 ist viel weniger verzeihend als neuere Browser, insbesondere Chrome. Ich benutze gerne JSLint , um diese Fehler zu finden. Es werden unter anderem diese falsch platzierten Kommas gefunden. Möglicherweise möchten Sie die Option aktivieren, um falsche Leerzeichen zu ignorieren.

Zusätzlich zu falsch platzierten Kommas berichtete in diesem Blog in den Kommentaren jemand:

Ich habe einen Fehler gesucht, der nur im IE (7) "Erwartete Kennung" sagte. Meine Recherche führte mich zu dieser Seite. Nach einiger Frustration stellte sich heraus, dass das Problem, dass ich ein reserviertes Wort als Funktionsnamen verwendete ("Schalter"). Der Fehler war nicht klar und zeigte auf die falsche Zeilennummer.

Muhd
quelle
1

Dieser Fehler tritt auf, wenn wir ein Komma am Ende des Arrays oder im Funktionscode hinzufügen oder verpassen. Es ist notwendig, den gesamten Code einer Webseite für einen solchen Fehler zu beobachten.

Ich habe es in einem Facebook-App-Code erhalten, als ich für eine Facebook-API codiert habe.

<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
quelle
0

Das klingt für mich wie ein Skript, das mit src eingezogen und nur zur Hälfte geladen wurde, was zu einem Syntaxfehler führt, da der Rest nicht geladen wird.

Roland Bouman
quelle
0

IE7 hat Probleme mit Arrays von Objekten

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

Eine weitere Variante dieses Fehlers: Ich hatte eine Funktion namens 'continue' und da es sich um ein reserviertes Wort handelt, wurde dieser Fehler ausgelöst. Ich musste meine Funktion 'continueClick' umbenennen.

Kevin Audleman
quelle
0

Vielleicht haben Sie ein Objekt mit einer Methode 'Konstruktor' und versuchen, diese aufzurufen.

Niels Steenbeek
quelle
0

Möglicherweise tritt dieses Problem bei der Verwendung von Knockout JS auf. Wenn Sie versuchen, das Klassenattribut wie im folgenden Beispiel festzulegen, schlägt dies fehl:

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

Entfliehen Sie der Klassenzeichenfolge wie folgt:

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

Meine 2 Cent.

iDevGeek
quelle
0

Auch ich war auf dieses Problem gestoßen. Ich habe unten zwei Lösungen gefunden. 1). Entfernen Sie, wie oben von anderen erwähnt, zusätzliches Komma aus dem JSON-Objekt. 2). Auch meine JSP / HTML hatte. Aus diesem Grund wurde der alte Browser-Modus ausgelöst, der einen JS-Fehler für zusätzliches Komma verursachte. Bei Verwendung wird der HTML5-Modus des Browsers ausgelöst (falls unterstützt) und es funktioniert auch mit Extra Comma wie bei allen anderen Browsern FF, Chrome usw.


quelle
1
Willkommen bei Stack Overflow! Können Sie ein Beispiel geben, was dies bedeutet: "Meine JSP / HTML hatte."
Billrichards
0

Hier ist eine einfache Technik zum Debuggen des Problems: Geben Sie das Skript / den Code an die Konsole zurück. Kopieren Sie den Code von der Konsole in Ihre IDE. Die meisten IDEs führen eine Fehlerprüfung des Codes durch und markieren Fehler. Sie sollten den Fehler fast sofort in Ihrem JavaScript / HTML-Editor sehen können.

Hesenberg
quelle
0

Hatte das gleiche Problem mit einer anderen Konfiguration. Dies war in einer eckigen Fabrikdefinition, aber ich gehe davon aus, dass es auch anderswo passieren könnte:

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

Fix ist sehr exotisch:

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

Dies kann auch in Typescript passieren, wenn Sie eine Funktion mitten im Nirgendwo innerhalb einer Klasse aufrufen. Beispielsweise

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

Funktionsaufrufe console.log()müssen wie innerhalb von Funktionen sein. Nicht in dem Bereich, in dem Sie Klassenfelder deklarieren sollten.

Rayray
quelle
0

Typescript für Windows-Problem

Dies funktioniert in IE, Chrome, FF

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

Dies funktioniert in Chrome, FF, funktioniert nicht in IE 11

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

Ich denke, es hat irgendwie mit Windows reservierten Wörtern zu tunGeben Sie hier die Bildbeschreibung ein

Lev Savranskiy
quelle
0

Ich bin auf diesen Fehler gestoßen, bei dem anstelle eines nachgestellten Kommas oder dergleichen diese Syntax in einer constants.js verwendet wurde

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

IE 11 gefiel das überhaupt nicht.

Wie bereits erwähnt, konnte dies jedoch leicht mithilfe von behoben werden

   var titles = {
     'title.X': 'X title',
     'title.Y': 'Y title'   
   }
Kingy
quelle
1
Dies sind keine äquivalenten Ausdrücke. Der erste verwendet die Werte der Eigenschaften title.X und title.Y als Schlüssel im Titelobjekt, der zweite verwendet die Zeichenfolgen "title.X" und "title.Y" als Schlüssel.
Nabrown