Resolviendo esto requiere el conocimiento de dos conceptos de JavaScript.
La primera es la variable local especial arguments
que se puede usar para acceder a los argumentos de la función sin conocer su nombre y funciona como una matriz. Sin embargo, arguments
es no un Array
, sino que es "de la matriz como" - que tiene propiedades denominadas 0..n-1
, donde n
es el número de argumentos de la función y una propiedad length
- objeto. Un uso simple demostración podría ser:
function f (a) { // can include names still, if desired
// arguments instanceof Array -> false (exceptions to this?)
var firstArg = arguments[0]
// a === firstArg -> always true
// iterate all arguments, just as if it were an Array:
for (var i = 0; i < arguments.length; i++) {
alert(i + " : " + arguments[i])
}
}
f("a","b","c")
La segunda característica es Function.apply
que invocará una función con un contexto específico (this
cuando se le llama) con argumentos que resultan de la expansión de un "array como" objeto. Pero vea.
Por lo tanto, poner juntos:
function fireStartedEvent() {
for(var i = 0; i < startedListeners.length; i++) {
// jQuery will often pass in "cute" things, such as a element clicked
// as the context. here we just pass through the current context, `this`,
// as well as the arguments we received.
var arg = Array.prototype.slice.call(arguments)
startedListeners[i].apply(this, args)
}
}
Aunque la especificación ECMAScript sólo se pide una "matriz como" objeto, Function.apply
no universalmente trabajar con una "matriz como" objeto y una serie de implementaciones comunes requieren un objeto adecuado Array
. La advertencia desde el enlace Function.apply
:
Nota: mayoría de los navegadores, incluyendo Chrome 14 y Internet Explorer 9, todavía no aceptan matriz como objetos y se producirá una excepción [si un objeto no-Array esta pasado]. [FireFox se corrigió en la versión 4.]
Afortunadamente, hay una manera relativamente sencilla idioma para convertir un "array como" objeto en un Array
(que es irónico porque Array.slice
qué funciona de forma universal con una "matriz como" objeto):
var args = Array.prototype.slice.call(arguments);
(y luego args
puede usarse universalmente en ser utilizado en Function.apply
.)
¿Es posible pasar parámetros como una matriz en JavaScript? Eso podría hacerlo. – Cyclone