2015-06-05 13 views
9

Quando si esegue jshint su molti dei miei file JavaScript, ricevo avvertimenti come questo:Impedisci a jshint di segnalare che una variabile non è utilizzata per specifiche variabili locali?

file.js: line X, col 93, 'fromParams' is defined but never used. 
file.js: line X, col 72, 'toParams' is defined but never used. 
file.js: line X, col 63, 'toState' is defined but never used. 
file.js: line X, col 56, 'event' is defined but never used. 

Per qualcosa di simile:

$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) { 
    // ... some code that doesn't use event, toState, toParams, or fromParams... 
}); 

Questo viene molto spesso per i callback di un tipo o di un altro - - la funzione di callback richiede un certo numero di parametri, ma il mio codice nella funzione non utilizza tutti i parametri, quindi jshint si lamenta di loro. Ma i parametri devono essere lì!

C'è doveva essere modi di disattivazione di questo avvertimento in alcune sezioni di codice come questo:

/*jshint -W098 */ 
$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) { 
/*jshint +W098 */ 

Ma non funziona a causa di un bug in jshint, vedere this open issue.

E 'anche possibile disattivare l'avviso per intere funzioni in questo modo:

/* jshint unused:false */ 

... ma questo è inaccettabile, perché sarebbe eliminare l'avviso per tutte le le variabili non utilizzate nella funzione, ed io voglio essere avvisato di tutto ciò che è inutilizzato eccetto per i parametri di funzione che so specificamente che non ho intenzione di usare.

Esiste comunque un modo per aggirare questo problema? Mi piacerebbe molto che il mio codice non attivasse avvisi di linter, ma così com'è, jshint segnalerà diversi avvertimenti "definiti ma mai usati" che non so come risolvere.

+0

Aggiungi '/ * jshint inutilizzato: falso * /' nel campo di applicazione della funzione (la prima riga all'interno della funzione) dovrebbe farlo. Non puoi essere specifico per una particolare variabile, non che io sappia. Questo verrà applicato solo nell'ambito della funzione. – Xotic750

+1

Se non hai bisogno di nessuno dei parametri puoi rimuoverli ... non c'è bisogno di essere lì, –

+1

stavo per aggiungere quello. :) Un'altra alternativa (nel peggiore dei casi in cui jshint è più importante, ma non necessariamente, del tuo codice attuale) è creare 'var's all'interno della funzione e assegnarli con' arguments [n] ' – Xotic750

risposta

7

È possibile utilizzare /* jshint unused:vars */ nella parte superiore della funzione per sopprimere gli avvertimenti sui parametri di funzione ma ricevere comunque avvisi su altre variabili.

3

Questo dovrebbe funzionare in base alla domanda e ai commenti.

/*global console */ 

(function() { 
    'use strict'; 

    var jshintUnused; 

    (function() { 
     return; 
    }(jshintUnused)); 

    function blah(arg1, arg2, arg3) { 
     jshintUnused = arg1; 
     jshintUnused = arg2; 
     console.log(arg3); 
    } 

    blah(null, null, 'Hello world'); 
}()); 

Ora confrontare il metodo di cui sopra contro /*jshint unused: false*/

jsHint unused

In aggiunta a ciò, questa opzione vi avvertirà di non utilizzati variabili globali dichiarate tramite la direttiva globale.

Questo può essere impostato su Vars per controllare solo le variabili, non sui parametri di funzione o su strict per controllare tutte le variabili e i parametri. Il comportamento predefinito (true) prevede che i parametri non utilizzati siano seguiti da un parametro utilizzato.

/*global console */ 

(function() { 
    'use strict'; 

    var jshintUnused; 

    (function() { 
     return; 
    }(jshintUnused)); 

    function blah(arg1, arg2, arg3, oops) { 
     jshintUnused = arg1; 
     jshintUnused = arg2; 

     var hmm; 

     console.log(arg3); 
    } 

    blah(null, null, 'Hello world'); 
}()); 

È possibile che questo sapranno che oops e hmm non avrebbe dovuto essere dichiarato e si otterrà. Warning: unused var: oops, hmm

/*global console */ 

(function() { 
    'use strict'; 

    function blah(arg1, arg2, arg3, oops) { 
     /*jshint unused: false */ 
     var hmm; 

     console.log(arg3); 
    } 

    blah(null, null, 'Hello world'); 
}()); 

Nella sopra jsHint ignorato il controllo variabile inutilizzato per l'intera funzione e si otterrà nessun avviso a tutti.

Il metodo che ho dimostrato consente di:

Impedire jshint da riportando che una variabile è utilizzato per le variabili locali specifici?

L'altro suggerimento che ho fatto è stato quello di assegnare i parametri da utilizzare a una variabile locale alla funzione utilizzando arguments.

/*global console */ 

(function() { 
    'use strict'; 

    function blah() { 
     var arg3 = arguments[2]; 

     console.log(arg3); 
    } 

    blah(null, null, 'Hello world'); 
}()); 

Ma questo non sembra corrispondere alle vostre esigenze in base ai vostri commenti.

Ma i parametri devono essere lì!

Non sono interessato a rimuovere parametri del genere. Per uno, penso che sia piuttosto brutto e un difetto di javascript che ti è permesso farlo, ma questa è solo la mia opinione. Ma più praticamente, se sto usando l'ultimo parametro , avrò bisogno degli altri lì.

Infine, è suggerito /*jshint unused: vars */.

/*global console */ 

(function() { 
    'use strict'; 

    function blah(arg1, arg2, arg3, oops) { 
     /*jshint unused: vars */ 
     var hmm; 

     console.log(arg3); 
    } 

    blah(null, null, 'Hello world'); 
}()); 

Quando provo questo con l'ultimo modulo del jsHintgit repo tanto sono

Four unused variables 
8 hmm 
6 oops 
6 arg2 
6 arg1 

che non era quello che mi aspettavo, mi sarei aspettato.

Four unused variables 
8 hmm 

È possibile provare tutti questi online incollando direttamente nel l'interfaccia.

+0

Grazie - il tuo primo metodo sembra molto carino! Sareste disposti a concedere una doppia licenza su MIT o CC-BY? (Tutti i miei contributi sono CC-BY con doppia licenza, quindi non ti sto chiedendo di fare nulla che non abbia io stesso :)). – cxw

0

ESLint offrono opzioni migliori per questo caso d'uso che poi ti permette di non disabilitare questa importante regola (che mi ha salvato il tempo di debug durante il refactoring del codice)

  1. per impostazione predefinita, non getterà avvertimento per i primi argomenti se viene utilizzato l'ultimo argomento denominato (opzione { "args": "after-used" }), poiché non verranno sempre utilizzati tutti i parametri di callback ricevuti

  2. è possibile specificare un modello di nome parametro per quelli che possono essere ignorati in modo sicuro (opzione { "argsIgnorePattern": "^_" }

http://eslint.org/docs/rules/no-unused-vars

Quindi, se avete un po 'di codice come

foo.bar(function (a, b, c, d) { 
    var unusedLocal; 

    console.log(c); 
}); 

ESLint alzerà solo gli avvisi per "d" e "unsusedLocal"

Se si vuole veramente lasciare la "d" parametro Allucinante fa parte della firma standard di callback e potrebbe essere utilizzato in seguito, lo "argsIgnorePattern" viene in tuo aiuto. E ancora meglio, si fa tutto il tuo codice più esplicito sulle variabili intentionnaly inutilizzati

foo.bar(function (_a, _b, c, _d) { 
    var unusedLocal; 

    console.log(c); 
}); 

Questa volta, ESLint alzerà solo gli avvisi per "unsusedLocal" e si sa in un primo sguardo che si prevede parametri da utilizzare o meno in questo codice

Problemi correlati