Algunos usuarios informan errores ocasionales de JS en mi sitio. El mensaje de error dice "Identificador, cadena o número esperado" y el número de línea es 423725915, que es solo un número arbitrario y cambia para cada informe cuando esto ocurre. Esto sucede principalmente con los navegadores IE7 / Mozilla 4.0.
Escaneé mi código un montón de veces y ejecuté jslint pero no detectó nada. ¿Alguien sabe del tipo general de problemas de JS que conducen a este mensaje de error?
javascript
psicotik
fuente
fuente
Respuestas:
La causa de este tipo de error a menudo puede ser una coma mal colocada en una definición de objeto o matriz:
var obj = { id: 23, name: "test", <-- }
Si aparece en una línea aleatoria, tal vez sea parte de una definición de objeto que está creando dinámicamente.
fuente
,\s*?\n?\s*?]
y,\s*?\n?\s*?\}
El uso de la palabra clase como clave en un diccionario Javascript también puede desencadenar el temido error "Identificador, cadena o número esperado" porque clase es una palabra clave reservada en Internet Explorer.
MALO
{ class : 'overlay'} // ERROR: Expected identifier, string or number
BUENO
{'class': 'overlay'}
Cuando utilice una palabra clave reservada como clave en un diccionario Javascript, incluya la clave entre comillas.
Espero que esta pista te salve un día de depuración infernal.
fuente
En realidad, recibí algo así en IE recientemente y estaba relacionado con "errores" de sintaxis de JavaScript. Digo error entre comillas porque estaba bien en todas partes menos en IE. Esto fue bajo IE6. El problema estaba relacionado con la creación de objetos JSON y una coma adicional, como
{ one:1, two:2, three:3, }
IE6 realmente no le gusta esa coma después de 3. Puede buscar algo así, pequeños problemas delicados de formalidad de sintaxis.
Sí, pensé que el número de línea multimillonario en mi JavaScript de 25 líneas también era interesante.
Buena suerte.
fuente
Esta es una no respuesta definitiva: eliminar una respuesta tentadora pero incorrecta para ayudar a otros a navegar hacia las respuestas correctas.
Puede parecer que la depuración destacaría el problema. Sin embargo, el único navegador en el que se produce el problema es IE, y en IE solo puede depurar el código que formaba parte del documento original. Para el código agregado dinámicamente, el depurador solo muestra el elemento del cuerpo como la instrucción actual, e IE afirma que el error ocurrió en un número de línea enorme.
Aquí hay una página web de muestra que demostrará este problema en 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>
Esto me produjo el siguiente error:
Line: 54654408 Error: Object required
fuente
<script>
etiqueta, ya sea local o como recurso cargado. Depurar. Regrese a su guión de trabajo.Acabo de ver el error en una de mis aplicaciones, como una solución general, recuerde incluir el nombre de todas las propiedades de JavaScript que son iguales a la palabra clave.
Encontré este error después de atender un error en el que un objeto como:
var x = { class: 'myClass', function: 'myFunction'};
generó el error (la clase y la función son palabras clave) esto se solucionó agregando comillas
var x = { 'class': 'myClass', 'function': 'myFunction'};
Espero ahorrarte algo de tiempo
fuente
if(_features.delete){...}
que estaba causando un error porque eliminar es una palabra clave. stackoverflow.com/questions/26255/…http://closure-compiler.appspot.com/home detectará este error con una referencia precisa al número de línea real en el script infractor.
fuente
Como se señaló anteriormente, tener una coma adicional arrojó un error.
También en IE 7.0, no tener un punto y coma al final de una línea provocaba un error. Funciona bien en Safari y Chrome (sin errores en la consola).
fuente
IE7 es mucho menos indulgente que los navegadores más nuevos, especialmente Chrome. Me gusta usar JSLint para encontrar estos errores. Encontrará estas comas colocadas incorrectamente, entre otras cosas. Probablemente desee activar la opción para ignorar los espacios en blanco incorrectos.
Además de las comas colocadas incorrectamente, en este blog en los comentarios alguien informó:
fuente
Elimine lo no deseado, inicie sesión en la función. obtendrás la solución.
Refiera esto
http://blog.favrik.com/2007/11/29/ie7-error-expected-identifier-string-or-number/
fuente
Este error ocurre cuando agregamos o no quitamos una coma al final de la matriz o en el código de función. Es necesario observar el código completo de una página web para tal error.
Lo obtuve en un código de aplicación de Facebook mientras codificaba para una API de 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>
fuente
Esto me suena a una secuencia de comandos que se introdujo con src y se cargó a la mitad, lo que provocó un error de sintaxis, pero el resto no se cargó.
fuente
IE7 tiene problemas con matrices de objetos
columns: [ { field: "id", header: "ID" }, { field: "name", header: "Name" , /* this comma was the problem*/ }, ...
fuente
Otra variación de este error: tenía una función llamada 'continuar' y, dado que es una palabra reservada, arrojó este error. Tuve que cambiar el nombre de mi función 'continueClick'
fuente
Tal vez tenga un objeto que tenga un método 'constructor' e intente invocarlo.
fuente
Puede encontrar este problema mientras usa Knockout JS. Si intenta configurar el atributo de clase como el ejemplo a continuación, fallará:
<span data-bind="attr: { class: something() }"></span>
Escapa de la cadena de clase de esta manera:
<span data-bind="attr: { 'class': something() }"></span>
Mis 2 centavos.
fuente
Yo también me había encontrado con este problema. Encontré a continuación dos soluciones. 1). Igual que lo mencionado por otros anteriormente, elimine la coma adicional del objeto JSON. 2). Además, mi JSP / HTML estaba teniendo. Debido a esto, estaba activando el modo anterior del navegador, lo que daba un error JS para una coma adicional. Cuando se usa, activa el modo HTML5 del navegador (si es compatible) y funciona bien incluso con Extra Comma al igual que cualquier otro navegador FF, Chrome, etc.
fuente
Aquí hay una técnica fácil para depurar el problema: repita el script / código en la consola. Copie el código de la consola en su IDE. La mayoría de los IDE realizan una verificación de errores en el código y resaltan los errores. Debería poder ver el error casi de inmediato en su editor de JavaScript / HTML.
fuente
Tuve el mismo problema con una configuración diferente. Esto fue en una definición de fábrica angular, pero supongo que también podría suceder en otros lugares:
angular.module("myModule").factory("myFactory", function(){ return { myMethod : function() // <--- error showing up here { // method definition } } });
Fix es muy exótico:
angular.module("myModule").factory("myFactory", function(){ return { // <--- notice the absence of the return line myMethod : function() { // method definition } } });
fuente
Esto también puede suceder en TypeScript si llama a una función en medio de la nada dentro de una clase. Por ejemplo
class Dojo implements Sensei { console.log('Hi'); // ERROR Identifier expected. constructor(){} }
Las llamadas a funciones, como
console.log()
deben ser funciones internas. No en el área donde debería declarar campos de clase.fuente
Problema de TypeScript para Windows
Esto funciona en IE, chrome, FF
export const OTP_CLOSE = { 'outcomeCode': 'OTP_CLOSE' };
Esto funciona en Chrome, FF, no funciona en IE 11
export const OTP_CLOSE = { outcomeCode: 'OTP_CLOSE' };
Supongo que de alguna manera está relacionado con las palabras reservadas de Windows.
fuente
Me encontré con este error en el que, en lugar de una coma final o algo así, esta sintaxis se había utilizado en constants.js
var titles = { [title.X]: 'X title', [title.Y]: 'Y title' }
A IE 11 no le gustó esto en absoluto.
Como se mencionó anteriormente, esto se solucionó fácilmente usando
var titles = { 'title.X': 'X title', 'title.Y': 'Y title' }
fuente