2012-04-25 13 views
55

¿Cuál sería la forma correcta de resolver el error jslint en este caso? Estoy agregando una función getter a un objeto que usa esto. No sé cómo hacer esto sin crear la función dentro del ciclo.No realice funciones dentro de un bucle

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

Por qué no silenciar la jslint error por completo? [Aquí está] (http://stackoverflow.com/a/40060701/307454) cómo. – lifebalance

+1

Porque el error está ahí por una razón. No creo que sea muy agradable escribir código como este, donde muchas de las mismas funciones se crean sin motivo real. –

+1

_Sometimes_ jslint no es necesariamente la mejor guía para el estilo de codificación adecuado ... – lifebalance

Respuesta

93

mover la función fuera del bucle:

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 simplemente ignorar el mensaje utilizando la loopfunc option en la parte superior del archivo:

/*jshint loopfunc:true */ 
+0

Ah, no creo que el puntero "this" funcione de esa manera. ¿No está apuntando a la función ficticia en lugar de al objeto en el resultado [i]? En otras palabras, ¿todavía se encuentra name_ correctamente? –

+2

@ 0x80 'this' apunta al contexto de la función, que es' results [i] 'en este caso. http://jsfiddle.net/W5vfw/ –

+2

¡Maravilloso! Gracias por explicar esto claramente. Esta fue una de esas cosas de las que nunca tuve confianza en Javascript. –

Cuestiones relacionadas