No hi ha causa visible per al “testimoni inesperat IL·LEGAL”


L’error

Quan l’intèrpret de JavaScript analitza el codi, es divideix en parts anomenades “tokens”. Quan un testimoni no pot classificar-se en un dels quatre tipus de tokens bàsics, s’etiqueta com “IL·LEGAL” en la majoria de les implementacions, i es genera aquest error.

Es genera el mateix error si, per exemple, intenta executar un arxiu js amb un @ caràcter deshonest, una clau mal col·locada, un parèntesi, “cometes intel·ligents”, cometes simples no incloses correctament (per exemple this.run('dev1)), etc..

Moltes situacions diferents poden causar aquest error. Però si no té cap error de sintaxi obvi o caràcter il·legal, pot ser causat per un caràcter il·legal invisible. D’això es tracta aquesta resposta.

Però no puc veure res il·legal!

Hi ha un caràcter invisible en el codi, just després del punt i coma. És el caràcter d’espai Unicode U+200B d’ample zero (també conegut com ZWSP entitat HTML ​). Se sap que aquest caràcter causa el Unexpected token ILLEGAL error de sintaxi de JavaScript.

I d’on va venir?

No puc dir amb certesa , però la meva aposta està en jsfiddle. Si enganxa el codi des d’allí, és molt probable que inclogui un o més U+200B caràcters. Sembla que l’eina fa servir aquest caràcter per controlar l’ajust de paraules en cadenes llargues.

ACTUALITZACIÓ 2013.01.07

Després de l’última actualització de jsfiddle, ara mostra a el personatge com un punt vermell com ho fa codepen. Aparentment, ja no està inserint U+200B caràcters per si sol, de manera que aquest problema hauria de ser menys freqüent a partir d’ara.

ACTUALITZACIÓ 2015.03.17

Rodamón sembla causar a vegades aquest problema també, a causa d’un error en VirtualBox. La solució, segons aquesta publicació de bloc, és establir sendfile off; en la seva configuració nginx, o EnableSendfile Off si fa servir Apache.

També es va informar que el codi enganxat de les eines de desenvolupador de Chrome pot incloure aquest caràcter, però no vaig poder reproduir-lo amb la versió actual (22.0.1229.79 en OSX).

Com puc detectar-?

El personatge és invisible, com sabem que està allà? Pot demanar-li al seu editor que mostri caràcters invisibles. La majoria dels editors de text tenen aquesta característica. Vim, per exemple, els mostra per defecte, i els ZWSP mostra com <u200b>. També pot netejar aquest en línia: jsbin mostra el caràcter com un punt vermell en els seus panells de codi (però sembla eliminar després de guardar i tornar a carregar la pàgina). CodePen.io també ho mostra com un punt i el manté fins i tot després de guardar-lo.

Problemes relacionats

Aquest personatge no és una cosa dolenta, en realitat pot ser força útil. Aquest exemple en Wikipedia demostra com es pot usar per controlar on s’ha d’ajustar una cadena llarga a la següent línia. No obstant això, si desconeix la presència de el personatge en el seu marcat, pot esdevenir un problema. Si ja el té dins d’una cadena (per exemple, la nodeValue d’un element DOM que no té contingut visible), pot esperar que aquesta cadena estigui buida, quan de fet no ho està ( fins i tot després d’aplicar String.trim).

ZWSP També pot fer que es mostri un espai en blanc addicional en una pàgina HTML, per exemple, quan es troba entre dos <div> elements (com es veu en aquesta pregunta). Aquest cas ni tan sols és reproduïble en jsfiddle, ja que el personatge s’ignora allà.

Un altre problema potencial: si la codificació de la pàgina web no es reconeix com a UTF-8, el caràcter pot mostrar-(com ​ en latin1, per exemple).

Si ZWSP està present en el codi CSS (codi en línia o un full d’estil extern), els estils tampoc es poden analitzar correctament, de manera que alguns estils no s’apliquen (com es veu en aquesta pregunta).

L’especificació ECMAScript

no vaig poder trobar cap menció a aquest caràcter específic en l’especificació ECMAScript (versions 3 i 5.1). La versió actual esmenta caràcters similars (U+200C i U+200D) en la secció 7.1, que diu que haurien de tractar-se com IdentifierPart s quan” fora dels comentaris, els literals de cadena i els literals d’expressió regular “. Aquests caràcters poden, per exemple, ser part d’un nom de variable (i de var x\u200c; fet funciona).

La secció 7.2 enumera els caràcters d’espai en blanc vàlids ( com tabulació , espai , espai sense interrupció, etc. ) i esmenta vagament que qualsevol altre ” separador d’espai ” Unicode ( categoria ” Zs ” ) s’ha de tractar com a espai en blanc . Probablement no sóc la millor persona per discutir les especificacions referent a això , però em sembla que U+200B hauria de considerar-se un espai en blanc d’acord amb això , quan de fet les implementacions ( al menys Chrome i Firefox ) semblen tractar-les com una cosa inesperada token ( o part d’un) , que causa l’error de sintaxi.

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *