2013-07-16 20 views
20

se ho qualcosa di simile:funzioni vuote in JavaScript

var blah = function() { }; 

e poi più tardi nel codice bla viene utilizzato, qual è il suggerimento che dice JSLint rimuovere il blocco vuoto?

+0

Probabilmente perché quel blocco funzione ('{}') non fa nulla. – acdcjunior

+6

Non so ... Potrei pensare a situazioni in cui ha senso. 'myClass.overridableFunction = function() {};' non genera un errore se si chiama 'overridableFunction()', e quindi un'estensione della classe potrebbe implementarla ulteriormente. – Katana314

+0

Quella o una funzione 'noop'. Succede. –

risposta

0

Questo

{ 
    ... 
} 

è considerato un blocco di codice e il suggerimento è ti permette di sapere che è vuota (non ci sono comandi in esso). Non è necessario rimuoverlo, come ha detto @ Katana314, potrebbe essere intenzionale.

+1

Questo non restituirà una 'funzione', restituirà solo un' nuovo oggetto() '(è una scorciatoia) e questi due completamente diversi. L'unico modo per restituire una funzione vuota è usare 'var myEmptyMethod = function() {}'. Per maggiori informazioni vedi [spiegazione di Douglas Crockford] (http://javascript.crockford.com/code.html#bonus) – RPDeshaies

4

Un sacco di controllori di codice controllano questo tipo di cose. Ciò non significa che dovresti mai avere blocchi di codice vuoti. A volte ci sono validi motivi per averli. Ma è spesso significa che il programmatore ha appena dimenticato di scrivere l'implementazione. :)

Quello che mi piace fare è inserire un commento nel corpo della funzione, spiegando perché è vuoto. Questo dovrebbe sopprimere l'avviso, ma non può dipendere dal fatto che il controllore del codice consideri un blocco di codice con un commento "vuoto".

var blah = function() { /* empty because ... */ }; 
+11

Una buona convenzione, anche se jshint si lamenterà ancora, perché Crocker. – dfreeman

+1

@dfreeman "perché Crocker" haha ​​ – Michael

+3

Questo è così f ** fastidioso. Il codice di Crocker per Object.create utilizza un blocco vuoto e non passerà JSLint. Ha bisogno di capire chi è il pubblico. Dovrebbe essere usato come controllo di pre-produzione o come controllo di integrità durante il ciclo di sviluppo? Perché in questo momento è ancora più confuso del normale. –

23

Non so che cosa jsLint pensa, ma se questo è un problema ed è necessario una soluzione allora si può fare qualcosa di simile al seguente:

var blah = function() { return undefined; }; // or just return; 

Aggiornamento: credo, Bergi 's ipotesi è giusta perché, sul jslint sito nella sezione Required Blocks:

JSLint si aspetta che se, mentre, do e per le dichiarazioni saranno fatte con i blocchi {vale a dire con le istruzioni racchiuse tra parentesi} .JavaScript consente di scrivere in questo modo: if (condizione) istruzione, che è noto per contribuire a errori nei progetti in cui molti programmatori sono che lavorano sullo stesso codice. Ecco perché JSLint prevede l'utilizzo di un blocco :

if (condition) { statements; } 

esperienza dimostra che questa forma è più resistente.

Quindi, probabilmente controlla solo i blocchi vuoti { } e annulla la funzione vuoto.

+9

Oppure semplicemente "return;"? – Ian

+0

@Ian, Sì, non è affatto definito. –

+3

Se si utilizza jQuery, è possibile chiamare $ .noop() anziché un ritorno; –

3

Se si intende utilizzare la funzione come un costruttore con la new dell'operatore:

// Returns the instance that was just created with the new operator. 
var ClassLikeFunction = function(){ 
    return this; 
}; 

D'altra parte, se è intenzionalmente una funzione vuota, senza valore di ritorno:

// Returns the same value as a function that returned nothing. 
var blankFunction = function(){ 
    return undefined; 
}; 
5

Se stai chiedendo quale opzione JsLint disattiva questo avviso: "debug: true"

Stranamente, i documenti non fanno riferimento a questo comportamento:

"Tollerare le dichiarazioni del debugger" | debug | true se le dichiarazioni debugger devono essere consentite. Impostare questa opzione su false prima di andare in produzione.

Ma se si guarda al the code, si può vedere che non vi avvisa con l'opzione di debug impostata su true:

function block(kind) { 
    // A block is a sequence of statements wrapped in braces. 

    ... 

    if (kind !== 'catch' && array.length === 0 && !option.debug) { 
     curly.warn('empty_block'); 
    } 
    ... 
} 
0

usare l'espressione lambda:

const blah =() => void 0; 

Questo renderà chiaro che blah è una funzione vuota che restituisce undefined.