Para conmemorar que no he escrito un blog durante 10 años, la primera publicación de blog comenzará con un truco tan interesante -___-
En ES5, cuando llamamos a una función, si los parámetros a aprobar se generan en función de otras funciones o condiciones, es decir, cuando no estamos seguros de cuántos parámetros se pasarán, ¿qué debemos hacer sin cambiar la función original?
(Por supuesto, trate de evitar la situación descrita en este artículo, como cambiar el parámetro a objeto o matriz, etc.)
La mayoría de las personas pueden saber que usar aplicar puede resolver este problema perfectamente:
Al igual que la llamada, aplique el primer parámetro se utilizará como el objeto llamado de la función, es decir, el puntero de esto en la función de llamada se reescribe como el primer parámetro. Si no es el método del objeto, puede ignorar esto y pasar un nulo.
La diferencia es que los siguientes parámetros, Aplicar, pone todos los parámetros que se pasarán a la función de llamada en una matriz, y la llamada se adjunta en una secuencia como la función original.
Como es una matriz, es controlable. Generar una matriz basada en otras funciones o juicios lógicos puede lograr el propósito de pasar en parámetros de números dinámicos.
Pero me encontré con un dolor de cabeza. Tuve que pasar en parámetros dinámicos al crear un objeto con nuevo. Solo me tomó una vez cada pocos años:
Si está utilizando ES6, con el parámetro REST, ninguno de los problemas anteriores es problemático. Tenga en cuenta que agregar tres puntos antes de la matriz Args no es un error de sintaxis, sino un método de escritura de parámetros REST proporcionado por ES6. Puede entenderlo como reemplazo ... Args con Args Array con caracteres tras soportes cuadrados.
Pero, ¿es realmente imposible implementar en ES5? Después de todo, la mayoría de ES6 es el azúcar sintáctico, y puede usar herramientas como Babel para compilar a ES5. Con preguntas, usemos Babel para compilar y ver lo que obtenemos:
Me sorprendió cuando vi la última línea. No tengas miedo. Analicemos este código. Primero, desmembréos y lo veamos en tres pasos:
1. No hay duda de que el uso de concat para concatenar nulo con nuestros parámetros en una matriz, como se aplica el segundo parámetro, es decir, obtenemos [nulo, 1, 2, 3];
2. Calculemos la aplicación. El primer parámetro FOO reemplazará la función para llamar al método de enlace nativo. El contenido de la segunda matriz de parámetros se pasará como parámetro de enlace, es decir, foo.bind (nulo, 1, 2, 3);
3. El primer parámetro del método de enlace es similar para aplicar y llamar, modificar este puntero y los parámetros posteriores pueden implantar el valor de argumento principal preestablecido predeterminado para la función. Es decir, cuando se ejecuta el enlace, obtenemos una clase FOO con tres valores de parámetros inyectados en el primer conjunto de soportes, que se llama foowithargs por el momento;
Finalmente, cuando somos nuevos foowithargs (); , no necesitamos pasar ningún parámetro. Equivalente al nuevo foo (1, 2, 3);