2012-04-25 19 views
55

Quale sarebbe il modo corretto di risolvere l'errore jslint in questo caso? Sto aggiungendo una funzione getter ad un oggetto che usa questo. Non so come farlo senza creare la funzione all'interno del ciclo.Non creare funzioni all'interno di un loop

for (var i = 0; i<processorList.length; ++i) { 
    result[i] = { 
     processor_: timestampsToDateTime(processorList[i]), 
     name_: processorList[i].processorName, 
     getLabel: function() { // TODO solve function in loop. 
      return this.name_; 
     } 
    }; 
} 
+0

Perché non tacere la errore jslint del tutto? [Ecco qui] (http://stackoverflow.com/a/40060701/307454) come. – lifebalance

+1

Perché l'errore esiste per un motivo. Non penso sia molto bello scrivere un codice come questo in cui numerose delle stesse identiche funzioni vengono create senza una vera ragione. –

+1

_Sometimes_ jslint non è necessariamente la guida definitiva allo stile di codifica corretto ... – lifebalance

risposta

93

spostare la funzione di fuori del ciclo:

function dummy() { 
    return this.name_; 
} 
// Or: var dummy = function() {return this.name;}; 
for (var i = 0; i<processorList.length; ++i) { 
    result[i] = { 
     processor_: timestampsToDateTime(processorList[i]), 
     name_: processorList[i].processorName, 
     getLabel: dummy 
    }; 
} 

... O semplicemente ignorare il messaggio utilizzando il loopfunc option nella parte superiore del file:

/*jshint loopfunc:true */ 
+0

Ah, non pensavo che il "questo" puntatore funzionasse ancora in questo modo. Non sta puntando alla funzione dummy invece dell'oggetto al risultato [i]? In altre parole, il nome_ è ancora correttamente trovato? –

+2

@ 0x80 'questo 'punta al contesto della funzione, che in questo caso è' risultati [i] '. http://jsfiddle.net/W5vfw/ –

+2

Meraviglioso! Grazie per aver spiegato questo chiaramente. Questa è stata una di quelle cose di cui non mi sono mai sentito fiducioso in Javascript. –

Problemi correlati