2014-10-15 14 views
9

ho notato in qualche codice legacy il seguente schema:Perché <! - Non genera un errore di sintassi?

<script> 
    <!-- 
    // code 
    // --> 
</script> 

Dopo alcune ricerche, questo sembra essere un vecchia tecnica molto per nascondere il contenuto di elementi script dal DOM quando il browser non supporta il <script> elemento. Maggiori informazioni possono essere trovate here.

La mia preoccupazione è questa: perché <!-- non genera un errore di sintassi? Ho trovato su whatwg.org's website che <!-- dovrebbe essere funzionalmente equivalente a // e che si collega a uno snippet da ECMAScript grammar about comments. Il problema è, <!-- non è affatto definito da quella grammatica.

Quindi questo sembra un comportamento indefinito che sembra essere implementato da tutti i principali browser. Esiste una specifica che permetta questo o è un trucco di retrocompatibilità che le persone stanno portando avanti?

+0

non fa parte di JS, è parte di html. – nnnnnn

+0

Funziona su file JS esterni o solo all'interno di file HTML? – Shomz

+0

Funziona anche in file di script esterni. E @nnnnnn, perché il parser HTML interpreta il mio JavaScript? Sembra strano. – raynjamin

risposta

5

Ufficialmente: perché c'è lo specific handling for it nella specifica HTML. Ad esempio, è una cosa "per fatto". Non è una cosa JavaScript, non la troverai nella grammatica JavaScript.

In via non ufficiale, sembrerebbe che almeno alcuni motori JavaScript lo gestiscano intrinsecamente, a volte in modi che rendono non valido quello che ritengo valido JavaScript. Per esempio, il V8 in un browser, questo non riesce:

eval("var a = 1; var n = 3; console.log(a<!--n);")

... con Unexpected end of input. Sono abbastanza sicuro che lo non dovrebbe essere il, ma non sono un avvocato che fa il parsing. Mi aspetto che per accedere false alla console, in questo modo fa:

eval("var a = 1; var n = 3; console.log(a<! --n);") 
 
// Note the space -------------------------^

Nota a margine: Meteor di jsparser d'accordo con me, copiare e incollare solo la punta all'interno delle doppie virgolette in esso .

Nota che i personaggi <! non vengono visualizzati in the specification, né sembrano esserci qualcosa di vicino a nessuna delle 70 occorrenze della parola "Commento" in là, né è in qualsiasi parte del comment grammar, quindi non sarebbe sembra essere un'eccezione esplicita specifica. È solo qualcosa che almeno alcuni motori JavaScript fanno per evitare di essere incasinato da persone che fanno cose stupide. Nessuna grande sorpresa. :-)

+1

Allora perché è giusto andare nella console del browser? In Node.js REPL? – raina77ow

+0

Posso metterlo ovunque: elementi di script in linea, riferimenti JS esterni, console .. tutto funziona perfettamente. – raynjamin

+1

@ raina77ow Personalmente lo vedrei come un caso di "beh questa non è ovviamente la sintassi di JS, quindi posso semplicemente assumere ciò che volevi dire e continuare felicemente". –

1

Essa è definita dalla W3's docs per gli agenti utente:

Il motore JavaScript permette la stringa "<!--" verificarsi all'inizio di un elemento script e ignora ulteriori caratteri fino alla fine del linea.

Così browser seguono questi standard

Problemi correlati