Alguns usuários estão relatando erros ocasionais de JS em meu site. A mensagem de erro diz "Esperado identificador, string ou número" e o número da linha é 423725915, que é apenas um número arbitrário e muda para cada relatório quando isso ocorre. Isso acontece principalmente com os navegadores IE7 / Mozilla 4.0.
Eu verifiquei meu código um monte de vezes e executei jslint, mas não detectou nada - alguém sabe do tipo geral de problemas de JS que levam a esta mensagem de erro?
javascript
psicótico
fonte
fonte
Respostas:
A causa desse tipo de erro geralmente pode ser uma vírgula mal colocada em uma definição de objeto ou matriz:
var obj = { id: 23, name: "test", <-- }
Se aparecer em uma linha aleatória, talvez seja parte de uma definição de objeto que você está criando dinamicamente.
fonte
,\s*?\n?\s*?]
e,\s*?\n?\s*?\}
Usar a palavra classe como uma chave em um dicionário Javascript também pode acionar o temido erro "Identificador, string ou número esperado" porque classe é uma palavra-chave reservada no Internet Explorer.
RUIM
{ class : 'overlay'} // ERROR: Expected identifier, string or number
BOA
{'class': 'overlay'}
Ao usar uma palavra-chave reservada como uma chave em um dicionário Javascript, coloque a chave entre aspas.
Espero que esta dica economize um dia infernal de depuração.
fonte
Na verdade, recebi algo parecido no IE recentemente e estava relacionado a "erros" de sintaxe JavaScript. Eu digo erro entre aspas porque estava bem em qualquer lugar, menos no IE. Isso foi no IE6. O problema estava relacionado à criação do objeto JSON e uma vírgula extra, como
{ one:1, two:2, three:3, }
O IE6 realmente não gosta dessa vírgula após 3. Você pode procurar por algo assim, pequenos problemas de formalidade de sintaxe delicados.
Sim, também achei interessante o número de linha de vários milhões em meu JavaScript de 25 linhas.
Boa sorte.
fonte
Esta é uma resposta definitiva: eliminar uma resposta tentadora, mas errada, para ajudar os outros a navegar em direção às respostas corretas.
Pode parecer que a depuração destacaria o problema. No entanto, o único navegador em que o problema ocorre é o IE, e no IE você só pode depurar o código que fazia parte do documento original. Para código adicionado dinamicamente, o depurador mostra apenas o elemento do corpo como a instrução atual e o IE afirma que o erro aconteceu em um grande número de linha.
Aqui está um exemplo de página da web que demonstrará esse problema no 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>
Isso gerou para mim o seguinte erro:
Line: 54654408 Error: Object required
fonte
<script>
tag, local ou como recurso carregado. Depurar. Volte para o seu script de trabalho.Acabei de ver o bug em um de meus aplicativos, como um resumo, lembre-se de incluir o nome de todas as propriedades javascript que são iguais à palavra-chave.
Encontrou este bug depois de atender a um bug onde um objeto como:
var x = { class: 'myClass', function: 'myFunction'};
gerou o erro (classe e função são palavras-chave) que foi corrigido adicionando aspas
var x = { 'class': 'myClass', 'function': 'myFunction'};
Espero te poupar algum tempo
fonte
if(_features.delete){...}
que estava causando um erro porque delete é uma palavra-chave. stackoverflow.com/questions/26255/…http://closure-compiler.appspot.com/home pegará esse erro com uma referência precisa ao número da linha real no script incorreto.
fonte
Conforme observado anteriormente, ter uma vírgula extra gerou um erro.
Também no IE 7.0, não ter um ponto-e-vírgula no final de uma linha causava um erro. Funciona bem no Safari e Chrome (sem erros no console).
fonte
O IE7 é muito menos tolerante do que os navegadores mais recentes, especialmente o Chrome. Eu gosto de usar JSLint para encontrar esses bugs. Ele encontrará essas vírgulas colocadas incorretamente, entre outras coisas. Você provavelmente desejará ativar a opção de ignorar espaços em branco inadequados.
Além de vírgulas colocadas indevidamente, neste blog, nos comentários que alguém relatou:
fonte
Remova o indesejado, entre na função. você obterá a solução.
Consulte isso
http://blog.favrik.com/2007/11/29/ie7-error-expected-identifier-string-or-number/
fonte
Este erro ocorre quando adicionamos ou deixamos de remover uma vírgula no final da matriz ou no código de função. É necessário observar todo o código de uma página da web para tal erro.
Eu consegui em um código de aplicativo do Facebook enquanto estava codificando para uma API do 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>
fonte
Isso me parece um script que foi puxado com src e carregado apenas na metade, causando um erro de sintaxe, se o restante não for carregado.
fonte
O IE7 tem problemas com matrizes de objetos
columns: [ { field: "id", header: "ID" }, { field: "name", header: "Name" , /* this comma was the problem*/ }, ...
fonte
Outra variação desse bug: eu tinha uma função chamada 'continue' e como é uma palavra reservada, gerou este erro. Tive que renomear minha função 'continueClick'
fonte
Talvez você tenha um objeto com um método 'construtor' e tente invocá-lo.
fonte
Você pode encontrar esse problema ao usar o Knockout JS. Se você tentar definir o atributo de classe como o exemplo abaixo, ele falhará:
<span data-bind="attr: { class: something() }"></span>
Escape a string de classe assim:
<span data-bind="attr: { 'class': something() }"></span>
Meus 2 centavos.
fonte
Eu também havia me deparado com esse problema. Encontrei abaixo duas soluções. 1). Igual ao mencionado por outros acima, remova a vírgula extra do objeto JSON. 2). Além disso, meu JSP / HTML estava tendo. Por causa disso, ele estava ativando o modo antigo do navegador, que gerava um erro JS para vírgula extra. Quando usado, aciona o modo HTML5 do navegador (se compatível) e funciona bem mesmo com Extra Comma, como qualquer outro navegador FF, Chrome etc.
fonte
Aqui está uma técnica fácil para depurar o problema: echo o script / código para o console. Copie o código do console em seu IDE. A maioria dos IDEs realiza verificação de erros no código e destaca os erros. Você deve conseguir ver o erro quase imediatamente no seu editor de JavaScript / HTML.
fonte
Tive o mesmo problema com uma configuração diferente. Isso estava em uma definição de fábrica angular, mas suponho que poderia acontecer em outro lugar também:
angular.module("myModule").factory("myFactory", function(){ return { myMethod : function() // <--- error showing up here { // method definition } } });
A correção é muito exótica:
angular.module("myModule").factory("myFactory", function(){ return { // <--- notice the absence of the return line myMethod : function() { // method definition } } });
fonte
Isso também pode acontecer em Typescript se você chamar uma função no meio do nada dentro de uma classe. Por exemplo
class Dojo implements Sensei { console.log('Hi'); // ERROR Identifier expected. constructor(){} }
Chamadas de função, como
console.log()
devem estar dentro de funções. Não na área onde você deveria declarar campos de classe.fonte
Texto datilografado para problema do Windows
Isso funciona no IE, chrome, FF
export const OTP_CLOSE = { 'outcomeCode': 'OTP_CLOSE' };
Isso funciona no cromo, FF, não funciona no IE 11
export const OTP_CLOSE = { outcomeCode: 'OTP_CLOSE' };
Acho que de alguma forma está relacionado às palavras reservadas do Windows
fonte
Eu me deparei com este erro onde, em vez de uma vírgula final ou algo parecido, esta sintaxe foi usada em um constants.js
var titles = { [title.X]: 'X title', [title.Y]: 'Y title' }
O IE 11 não gostou nada disso.
Conforme mencionado anteriormente, isso foi facilmente corrigido usando
var titles = { 'title.X': 'X title', 'title.Y': 'Y title' }
fonte