2013-05-17 14 views
18

Io uso JSLint tutto il tempo, ma proprio oggi, ho trovato un errore che non avevo mai visto prima. Con questo codice, ho ottenuto l'errore mostrato di seguito:Errore JSLint: Previsto 'ignore' e invece visto 'ex'

try { 

    document.execCommand('BackgroundImageCache', false, true); 

} catch (ex) {} 

Errore:

Expected 'ignore' and instead saw 'ex'. 
} catch (ex) {} 

Così ho cambiato il mio codice a quanto segue, e l'errore è andato via:

try { 

    document.execCommand('BackgroundImageCache', false, true); 

} catch (ignore) {} 

Non riesco a trovare alcuna spiegazione su Internet sul perché questo avrebbe risolto l'errore. Qualcuno sa cosa succede o perché questo ha risolto il problema?

Grazie.

risposta

29

Penso che tu abbia ragione - jslint non si lamentava in questo modo. Invece, ti ha detto che dovevi fare qualcosa con ex, giusto? Controllerò Github per vederlo e modificarlo più tardi. EDIT: Grande cattura [da te]! Crockford, l'autore di JSLint, added this on April 29th of this year sulla linea 3444. E usa i blocchi vuoti catch nella sorgente di jslint, quindi immagino che debba darci anche il kludge. ; ^)

JSLint vuole che kludge vuote catch blocchi con ignore come il nome della variabile in modo che sia evidente a persone che leggono il codice che si intenzionalmente significava di non fare nulla nel vostro catch blocco. Come Crockford says elsewhere, egli ritiene che "è difficile scrivere programmi corretti usando idiomi difficili da distinguere da errori evidenti".

1.) ex usato (bene)

Quindi (come sto indovinando si sa) se si scrive il codice e fare qualcosa con ex, JSLint non si lamenta.

/*jslint browser: true, white:true, sloppy:true*/ 

var spam; 

try { 
    spam = "spam"; 
} catch (ex) { 
    window.alert(ex); 
} 

2.) ex mezzi inutilizzati ignore (va bene anche)

Quindi, se si intende di non fare nulla con ex, vuole il codice per dire la gente non ha rovinare lasciando lì l'equivalente ex nominando quella variabile ignore.

/*jslint browser: true, white:true, sloppy:true*/ 

var spam; 

try { 
    spam = "spam"; 
} catch (ignore) { 
} 

3.) ignore utilizzato (errore!)

Quindi, in tipico stile Crockfordian, è ora non può uso ignore ed effettivamente fare qualcosa nel blocco catch!

/*jslint browser: true, white:true, sloppy:true*/ 

var spam; 

try { 
    spam = "spam"; 
} catch (ignore) { 
    window.alert(ignore); 
} 

Che dà

Unexpected 'ignore'. } catch (ignore) {

Solo un altro iper-esplicita "non fanno il codice che sembra un errore" azione di Crockford.

(A parte:. Potrebbe essere divertente per dare un'occhiata a Why are empty catch blocks a bad idea mentre sei in materia Onestamente, anche se ignore è probabilmente una convenzione utile, sulla base di tale discussione (voglio dire, include discutere Skeet contro vuote catch blocchi !), Sono un po 'sorpreso Crockford consente il kludge ignore, come il link sopra ha argomenti che sentono molto simile a lui per chiamare alcune espressioni regolari "non sicuri".)

+1

Wow! Grande scoperta e ottima risposta! Molte grazie. Mi stavo chiedendo onestamente se JSLint fosse stato cambiato sulla falsariga di quello che hai menzionato o meno, ma non avevo usato una dichiarazione di prova da così tanto tempo, non ne ero sicuro. Grazie ancora per quella bella risposta e questo ottimo link. – HartleySan

Problemi correlati