2010-06-22 8 views
9

Dato qualcosa comeragione di una analisi errore JavaScript in MSIE 8

var obj = { 
    foo: function(){ 
     try{ 
      doSomething(); 
      }catch(ex){ 
       //@TODO - report error 
      } 
    } 
} 

MSIE 8 getterebbe una "Missing virgola on line #", che era il luogo dove il @TODO era.

Dopo aver sedato le dozzine di @ TODO per essere! TODO, MSIE è stato in grado di analizzare correttamente la sceneggiatura e la vita è andata avanti. Mi manca qualcosa qui, MSIE usa una sorta di meccanismo non standard come // @ PRAGMA?

Googling per @TODO o // @ non ha riportato alcun risultato utile.

+0

Non succede sulla mia copia di IE8. –

+0

T.J. Crowder: lo sarà se metti '/ * @ cc_on @ * /' sopra il codice. –

+0

Ho avuto un pensiero ieri. Se questo flag è avviato da javascript e rimane attivo per l'ambito ENTIRE; questo significa che per una pagina di wordpress con dozzine di script di terze parti, uno script potrebbe iniziarlo e tutti gli script verrebbero risucchiati nello stesso comportamento .... wow. – David

risposta

9

Questo ha a che fare con la compilazione condizionale, un'invenzione solo IE per la compilazione della compilazione JScript (nome IE per il loro sapore di ECMAScript) in base alle informazioni sul browser e sull'ambiente. La sintassi coinvolge il simbolo @ seguito da una stringa per creare una variabile, una direttiva o un'istruzione. In questo caso, la presenza di @TODO direttamente dopo l'inizio di un commento provoca l'interpretazione del testo del commento come un'istruzione di compilazione condizionale, con @TODO come variabile di compilazione condizionale (con valore NaN: vedere http://msdn.microsoft.com/en-us/library/k0h7dyd7%28v=VS.80%29.aspx).

Le dichiarazioni di compilazione condizionale sono generalmente contenute nei commenti JavaScript: queste sono lì per impedire ad altri browser di tentare di interpretare il codice ma non sono in effetti necessari per attivare la compilazione condizionale. La documentazione MSDN è qui:

http://msdn.microsoft.com/en-us/library/ahx1z4fs%28v=VS.80%29.aspx

Questa funzione è abilitata solo per il codice che appare dopo la compilazione condizionale è attivata, che si ottiene con

/*@cc_on @*/ 

Pertanto se si può trovare questa linea e rimuovere allora il tuo //@TODO - report error andrà bene così com'è. Tuttavia, parte del tuo codice potrebbe basarsi sulla compilazione condizionale, quindi questa potrebbe non essere un'opzione. Una soluzione è quella di inserire uno spazio tra l'inizio del commento (sia // o /*) e il @ simbolo:

// @TODO - report error 

la documentazione di Microsoft non è sufficientemente chiaro per sapere perché questo funziona, dal momento che le variabili di compilazione condizionale lavorare anche al di fuori commenti:

// The following works in IE: 

/*@cc_on @*/ 
var j = @_jscript_build; 
alert(j); 

quindi l'opzione più sicura sarebbe quella di evitare l'uso di @TODO del tutto.

+0

Sfortunatamente il mio materiale è solo una frazione del sovraccarico totale nelle dipendenze JS, come 100 LOC in un LOC totale da 120-140 K che viene inviato con ogni singolo layout HTML. – David

+0

Modificato dopo ulteriori ricerche. –