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?
javascript
psychotik
źródło
źródło
Odpowiedzi:
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.
źródło
,\s*?\n?\s*?]
,\s*?\n?\s*?\}
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.
źródło
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.
źródło
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
źródło
<script>
tagu, lokalnego lub jako załadowany zasób. Odpluskwić. Wróć do działającego skryptu.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
źródło
if(_features.delete){...}
co powodowało błąd, ponieważ delete to słowo kluczowe. stackoverflow.com/questions/26255/…http://closure-compiler.appspot.com/home wykryje ten błąd wraz z dokładnym odniesieniem do rzeczywistego numeru wiersza w skrypcie powodującym naruszenie.
źródło
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).
źródło
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ł:
źródło
Usuń niechciane, zaloguj się w funkcji. otrzymasz rozwiązanie.
Odnieś się do tego
http://blog.favrik.com/2007/11/29/ie7-error-expected-identifier-string-or-number/
źródło
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>
źródło
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.
źródło
IE7 ma problemy z tablicami obiektów
columns: [ { field: "id", header: "ID" }, { field: "name", header: "Name" , /* this comma was the problem*/ }, ...
źródło
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”
źródło
Może masz obiekt mający metodę „konstruktor” i spróbuj ją wywołać.
źródło
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.
źródło
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
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.
źródło
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 } } });
źródło
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.źródło
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 Windows
źródło
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' }
źródło