Solución:
apply
acepta una matriz y aplica la matriz como parámetros a la función real. Entonces,
Math.max.apply(Math, list);
puede entenderse como,
Math.max("12", "23", "100", "34", "56", "9", "233");
Entonces, apply
es una forma conveniente de pasar una matriz de datos como parámetros a una función. Recordar
console.log(Math.max(list)); # NaN
no funcionará, porque max
no acepta una matriz como entrada.
Hay otra ventaja de usar apply
, puede elegir su propio contexto. El primer parámetro, pasas a apply
de cualquier función, será el this
dentro de esa función. Pero, max
no depende del contexto actual. Entonces, cualquier cosa funcionaría en lugar de Math
.
console.log(Math.max.apply(undefined, list)); # 233
console.log(Math.max.apply(null, list)); # 233
console.log(Math.max.apply(Math, list)); # 233
Ya que apply
está realmente definido en Function.prototype
, cualquier objeto de función JavaScript válido, tendrá apply
función, por defecto.
En JavaScript ES6, simplemente use el operador Spread:
var list = ["12","23","100","34","56","9","233"];
console.log(Math.max(...list));
// ^^^ Spread operator
¿Alguien puede decirme cómo funciona el siguiente código?
Math.max.apply(Math,list)
Invoca un Math.max
funcionar con Math
objeto que se utilizará como this
referencia en la implementación de la función (cuerpo) y list
para pasar como argumentos.
Entonces esto eventualmente equivale a
Math.max("12","23","100","34","56", "9","233")
Parece que funciona si paso null o Math.
Obviamente Math.max
la implementación no usa la variable de instancia, no hay razón para hacerlo. La implementación nativa simplemente iteraría sobre arguments
y encuentra el máximo.
¿Todas las funciones nativas / definidas por el usuario tienen un método de llamada y aplicación que podemos usar?
Sí, todas las funciones se pueden invocar usando call
o apply
Referencias:
- MDN
.apply()
documentación (créditos a @RGraham)