2010-08-31 14 views
24

Un patrón común en jQuery es un método que toma una devolución de llamada a la que se le pasa un elemento de una matriz y su índice dentro de dicha matriz. Sin embargo, parece completamente aleatorio qué argumento es lo primero. Por ejemplo, de los documentos de jQuery en http://api.jquery.com:¿Por qué los argumentos de devolución de llamada de jQuery son inconsistentes?

  • jQuery.each(collection, callback(indexInArray, valueOfElement))
  • .each(function(index, Element))
  • jQuery.map(array, callback(elementOfArray, indexInArray))
  • .map(callback(index, domElement))
  • jQuery.grep(array, function(elementOfArray, indexInArray), [ invert ])
  • .filter(function(index))

En tres casos (jQuery.each, .each, .map) el índice es lo primero. En los otros dos (jQuery.grep, jQuery.map), el elemento es lo primero. Sé que la API ya está configurada, pero me parece una gran incoherencia.

¿Hay algún patrón que me falta o es solo aleatorio? ¿Debería solucionarse esto o debería callarlos y memorizarlos?

+2

Nice! Por lo tanto, las funciones de matriz de PHP no son las únicas con un orden de parámetros incoherente. –

Respuesta

8

No es totalmente aleatorio. Porque:

$.map($('selector'), function(el, index) { /* element (DOMElement) is first, index optional */ }); 
$('selector').map(function(index) { /* 'this' (DOMElement) is first.... index optional */ }); 

¿Vea el patrón? El segundo ejemplo tiene un segundo argumento, pero solo se pasa por conveniencia, y es el mismo que this.

El patrón es que el primer argumento siempre es "más" importante que el segundo, y el último argumento debe ser el menos importante (el "más opcional"). Por lo tanto, no necesita especificar todos los argumentos menos importantes si solo necesita uno. Y en el caso de $(...).each, a menudo ni siquiera necesitará ningún argumento, porque this es solo lo que desea.

+2

Lo mismo con los selectores y el contexto. El contexto $ (myselector, mycontext) es opcional y por eso es el segundo. –

+0

@Mark Schultheiss, exactamente. –

+0

tiene sentido - buen punto! Estaba empezando a molestarme, pero ahora si lo pienso así, probablemente pueda recordarlo. – Jason

2

Como Javascript le permite ignorar los parámetros que no está utilizando (es decir, puede definir una función de devolución de llamada que toma solo un parámetro, incluso si se llamará con dos), generalmente, el primer parámetro es el que usted es más probable que lo estén usando. (De hecho, el this varaible suele ser el elemento de datos que más probablemente use, seguido del primer parámetro, etc.)

7

Eso me frustra a veces también - $.each es el que siempre estropeo.

Creo que se debe a diferentes personas/equipos que trabajan en diferentes partes del marco. Es un marco impulsado por la comunidad, por lo que es probable que nadie lo descubriera desde el principio y, ahora que el marco está muy extendido, no pueden solucionarlo sin romper el 35% de todos los sitios en Internet.

No creo que se solucione, al menos esa es mi opinión/actitud. ¡Voy a tener que confiarlos a la memoria y esperar lo mejor!

0

en mi humilde opinión, $.map y $.grep se comportan como métodos de clase en Ruby, porque:

  • toman la matriz de destino como primer argumento.
  • devolución de llamada argumentos fin es consistente con Ruby (each_with_index)

eso es sólo mi mnemotécnica personal por mi experiencia Ruby.

Los otros métodos son un poco jQuery legacy y no es fácil de "arreglar", aunque todavía me gustaría que haya una solución, porque ya ocurrió que jQuery latest is not really LATEST, entonces ¿qué no es posible?

0

Según https://learn.jquery.com/using-jquery-core/iterating/

Una palabra de advertencia: $.map() cambia el orden de los argumentos de devolución de llamada [en comparación con $().map, $each() y $().each()]. Esto se hizo con el fin de que coincida con el método nativo de JavaScript .map() disponible en ECMAScript 5.

Cuestiones relacionadas