Los parámetros de función aparecerán en dos lugares, a saber, el lugar de definición de la función y el lugar de llamada de la función. Los parámetros en estos dos lugares son diferentes.
Parámetros formales (parámetros formales)
Los parámetros que aparecen en la definición de la función pueden considerarse como marcadores de posición. No tiene datos y solo puede esperar hasta que se llame a la función para recibir los datos pasados, por lo que se llama parámetro formal o formal. parámetro para abreviar.
Parámetros reales (parámetros reales)
Los parámetros proporcionados cuando se llama a la función contienen datos reales y serán utilizados por el código dentro de la función, por lo que se denominan parámetros reales, o parámetros reales para abreviar.
La diferencia y conexión entre los parámetros formales y los parámetros reales
1) Las variables de parámetros formales solo asignarán memoria cuando se llame a la función. Una vez completada la llamada, la memoria se liberará inmediatamente, por lo que las variables de parámetros formales solo son válidas dentro de la función. no se puede utilizar fuera de la función.
2) Los parámetros reales pueden ser constantes, variables, expresiones, funciones, etc. No importa qué tipo de datos sean los parámetros reales, deben tener ciertos valores al realizar llamadas a funciones para poder transferir estos valores a los parámetros formales. , por lo que debe utilizar la asignación, la entrada y otros métodos con antelación para obtener un determinado valor para los parámetros reales.
3) Los parámetros reales y los parámetros formales deben ser estrictamente consistentes en número, tipo y orden; de lo contrario, se producirá un error de "no coincidencia de tipos". Por supuesto, si es posible la conversión de tipo automática o se realiza una conversión de tipo forzada, el tipo de parámetro real también puede ser diferente del tipo de parámetro formal.
4) La transferencia de datos que ocurre en una llamada de función es unidireccional y el valor del parámetro real solo se puede transferir al parámetro formal, pero el valor del parámetro formal no se puede transferir al parámetro real en la dirección inversa. En otras palabras, una vez que se completa la transferencia de datos, los parámetros reales y los parámetros formales ya no están relacionados, por lo que durante la llamada a la función, los cambios en el valor de los parámetros formales no afectarán a los parámetros reales.
5) Aunque los parámetros formales y los parámetros reales pueden tener el mismo nombre, son independientes entre sí y no se afectan entre sí, porque los parámetros reales son válidos fuera de la función, mientras que los parámetros formales son válidos dentro de la función.
La función de los parámetros formales y los parámetros reales es pasar datos. Cuando se produce una llamada a una función, el valor del parámetro real se pasará al parámetro formal.
función de paso de parámetros nos permite pasar datos, y los datos pasados afectan los resultados de ejecución de la función, lo que hace que la función sea más flexible y reutilizable.
función foo (a, b) { console.log([a, b]); } foo(1, 2); //
En este ejemplo de salida [1, 2], a
y b
son variables locales en la función y solo se puede acceder a ellas dentro de la función. Al llamar a la función, los datos pasados coincidirán según la posición y se asignarán a a
y b
respectivamente.
Al crear una función, los parámetros establecidos entre paréntesis después function 函数名
se denominan parámetros formales ; al llamar a una función, los parámetros pasados entre paréntesis después del nombre de la función se denominan parámetros reales ; En el ejemplo anterior, a
y b
son parámetros formales, y los pasados en 1
y 2
son parámetros reales.
Debido a que los parámetros formales son variables declaradas, no se pueden declarar repetidamente con let
y const
.
función foo (a, b) { let a = 1; // Error, se ha declarado a const b = 1; // Error, se ha declarado b}
Todas las transferencias de funciones en JavaScript se pasan por valor, no por referencia. El llamado valor se refiere al valor almacenado directamente en la variable. Si el objeto se pasa como parámetro, entonces el valor es una referencia al objeto, no al objeto en sí. En realidad, este es un proceso de asignación implícito, por lo que cuando se pasan parámetros a una función, equivale a asignar valores de una variable a otra variable .
Valor original:
función agregar(núm) { devolver número + 1; } vamos a contar = 5; let result = add(count); // El proceso de paso de parámetros aquí puede considerarse como num = count; consola.log(recuento); // 5 console.log(resultado); // 6
valor de referencia:
función setName(obj) { obj.nombre = "Xiao Ming"; } dejar persona = {}; setName(person); // El proceso de paso de parámetros aquí puede verse como obj = person; console.log(person); // {name: "Xiao Ming"}
Las funciones en JavaScript no detectarán el tipo de parámetros ni la cantidad de parámetros pasados. Establecer dos parámetros formales al definir una función no significa que se deban pasar dos parámetros al llamar. Cuando se llama realmente, no importa si se pasan uno o tres parámetros, no se informará ningún error incluso si no se pasan parámetros.
Hay un objeto especial similar a una matriz llamado arguments
(no una instancia de Array
) en todas las funciones (que no son flechas), que contiene una copia de todos los parámetros reales. Podemos usarlo para obtener los valores de todos los parámetros reales según. al método de acceso al índice del valor de la matriz, también puede acceder a su propiedad arguments.length
para determinar la cantidad de parámetros pasados cuando realmente se llama a la función.
Por ejemplo:
función foo(a, b) { console.log(argumentos[0]); console.log(argumentos[1]); console.log(argumentos.longitud); } foo(10, 20); // Salida 10, 20, 2 en secuencia
En el ejemplo anterior, el primer parámetro de la función foo () es a y el segundo parámetro es b, que se puede obtener por separado mediante argumentos [. x]. Mismo valor. Por lo tanto, puedes incluso declarar una función sin establecer parámetros formales.
función foo() { console.log(argumentos[0]); console.log(argumentos[1]); } foo(10, 20); // Salida 10 y 20 en secuencia.
Se puede ver que los parámetros formales de la función JavaScript solo se escriben por conveniencia. Pasar tantos parámetros como desee no provocará un error.
Otra cosa a tener en cuenta es que arguments
se pueden usar junto con los parámetros formales, y los valores en el objeto arguments
se sincronizarán con los parámetros formales correspondientes. Por ejemplo:
función foo(a) { argumentos[0]++; consola.log(a); } foo(10); // Salida 11 //---------------------------------------- función foo2 (a) { a++; console.log(argumentos[0]); } foo2(10); // Salida 11
Cuando se modifica el valor de los argumentos [0] o a, el otro también se cambia. Esto no significa que accedan a la misma dirección de memoria, después de todo estamos pasando un valor primitivo. Todavía están separados en la memoria, pero sus valores se mantienen sincronizados debido a mecanismos internos.
Además, si falta el parámetro, el valor de este parámetro formal no se sincronizará con el valor correspondiente en el objeto arguments
. Por ejemplo, en el siguiente ejemplo, solo se pasa un parámetro, por lo que solo hay un valor de parámetro real en arguments
. En este momento, si argumentos [1] se establece en un valor determinado en la función, este valor no se sincronizará. al segundo parámetro formal, por ejemplo:
function foo(a,b) { argumentos[1] = 2; consola.log(b); } foo(1); // Salida indefinida
En este ejemplo, el parámetro formal b no tiene un parámetro real pasado y su valor predeterminado será undefined
. Pero si:
foo(1, undefinido); //
Cuando la salida 2 se pasa manualmente en undefined
, aparecerá un elemento con un valor undefined
en la matriz arguments
, que aún se puede sincronizar con el valor de b.
En modo estricto , los valores y parámetros formales en el objeto arguments
ya no estarán sincronizados. Por supuesto, si se pasan valores de referencia, aún se afectarán entre sí, pero esto es solo una característica de los valores de referencia. Por lo tanto, es mejor no confiar en este mecanismo de sincronización durante el desarrollo, es decir, no utilizar parámetros formales y sus valores correspondientes en el objeto arguments
al mismo tiempo.
No hay argumentos en las funciones de flecha
. Si la función se define usando la sintaxis de flecha, no hay ningún objeto de argumentos en la función y solo se puede acceder a él a través de los parámetros formales definidos.
deja foo = () => { console.log(argumentos[0]); }foo(); // Error, los argumentos no están definidos.
En algunos casos, se puede acceder a arguments
:
función fn1(). sea fn2 = () => { console.log(argumentos[0]); } fn2(); }fn1(5);
Pero estos arguments
no son de la función de flecha, sino que pertenecen a la función ordinaria externa. Cuando se accede arguments
en la función de flecha, arguments
de la función externa se encuentran a lo largo de la cadena de alcance.
Cuando una función contiene múltiples parámetros formales, llamar a la función se convierte en un problema, porque siempre debe asegurarse de que los parámetros pasados se coloquen en la posición correcta. ¿La limitación del orden de paso de parámetros?
Dado que los atributos del objeto están desordenados, el valor correspondiente está determinado por el nombre del atributo. Por lo tanto, puede pasar el objeto y utilizar las propiedades del objeto como parámetros reales, por lo que el orden de los parámetros no importa.
función foo(obj) { console.log(obj.nombre, obj.sexo, obj.edad); } foo({ sexo: 'Hombre', edad: 18, nombre: 'Xiao Ming' }); // Xiao Ming es hombre 18
Si no se proporcionan parámetros reales al llamar a una función, el valor predeterminado de los parámetros formales no está undefined
.
A veces queremos establecer un valor predeterminado específico. Antes de ES6, cuando no se admitía la configuración explícita del valor predeterminado, solo podíamos usar una solución alternativa:
function sayHi(name) {. nombre = nombre || 'todos'; console.log( 'Hola ' + nombre + '!'); } sayHi(); // Muestra '¡Hola a todos!'
y determina si hay alguna asignación verificando el valor del parámetro. Aunque el método anterior es simple, la desventaja es que si el parámetro real entrante corresponde a un valor booleano false
. El parámetro real no funcionará. Si necesita más precisión, puede usar una declaración if
o una expresión ternaria para determinar si el parámetro es igual a undefined
. Si es así, significa que falta el parámetro:
// la declaración if determina la función sayHi(name) {. si (nombre === indefinido) { nombre = 'todos'; } console.log( 'Hola ' + nombre + '!'); } //Función de juicio de expresión ternaria sayHi(nombre) { nombre = (nombre! == indefinido)? nombre: 'todos'; console.log( 'Hola ' + nombre + '!'); }
ES6 es mucho más conveniente porque admite la forma explícita de establecer valores predeterminados, como este:
function sayHi(name = 'everyone') { // Al definir una función, asigna valores directamente a los parámetros formales console.log( 'Hola' + nombre + '!'); } sayHi(); // Salida '¡Hola a todos!' sayHola('Tony'); // Salida '¡Hola Tony!' sayHi(undefinido); // Salida '¡Hola a todos!'
Estos resultados muestran que también determina si falta el parámetro según si el parámetro es igual a undefined
.
El valor predeterminado no solo puede ser un valor, también puede ser cualquier expresión legal, incluso una llamada a función:
function sayHi(name = 'every'+'one') { console.log( 'Hola ' + nombre + '!'); } sayHi(); // Salida '¡Hola a todos!' //------------------------------------------ función foo() { console.log('Llamando a foo'); devolver 'Tony'; } función decirHola(nombre = foo()) { console.log( 'Hola ' + nombre + '!'); } sayHola(); // Salida 'llamar a foo' // Salida '¡Hola Tony!' sayHi(indefinido); // Salida 'llamar a foo' // Salida '¡Hola Tony!' sayHi('John'); // Salida '¡Hola John!'
Puede ver que el valor predeterminado del parámetro de función solo se evaluará cuando se llame a la función y el valor del parámetro falte o undefined
, y no será evaluado cuando se define la función.
Por lo general, establecemos valores predeterminados para los parámetros para que podamos omitirlos adecuadamente al llamar a la función. Lo que debe tenerse en cuenta aquí es que cuando hay varios parámetros, si el parámetro con un valor predeterminado no se coloca al final. En realidad es imposible omitirlo.
función fn(x = 1, y) { console.log([x, y]); } fn(); // salida[1, indefinido] fn(2); //salida[2, indefinido] fn(, 2); // Error, error de sintaxis (aquí no se admiten espacios vacíos como matrices) fn(undefinido, 2); // Salida [1, 2] (¡Es mejor pasar 1 por conveniencia!)
En el ejemplo anterior, el valor predeterminado establecido para el parámetro formal x parece no tener sentido. Por tanto, lo mejor es poner parámetros con valores predeterminados al final:
función fn(x, y = 2) { console.log([x, y]); } fn(); // salida[indefinido, 2] fn(1); //salida[1, 2] fn(1, 1) //salida[1, 1]Problema de omisión de parámetros
Cuando varios parámetros tienen valores predeterminados establecidos, el problema vuelve a surgir. No puede omitir los parámetros anteriores y solo pasar los parámetros reales al último parámetro.
función fn(x, y = 2, z = 3) { console.log([x, y, z]); } fn(1, , 10) // Informar error
Sabíamos antes que podemos evitar la restricción del orden de los parámetros pasando objetos. ¿Cómo implementar los valores predeterminados de los parámetros? Usar ||
, sentencias if
o expresiones ternarias para juzgar también es una solución, pero parece un poco al revés. Los siguientes son otros dos métodos nuevos en ES6.
Los valores predeterminados de los parámetros se utilizan junto con Object.assign()
función fn(obj = {}) { dejar defaultObj = { x: indefinido, y: 2, z: 3 } let resultado = Object.assign(defaultObj, obj); console.log([resultado.x, resultado.y, resultado.z]); } fn(); // salida [indefinido, 2, 3] fn({ x: 1, z: 10 }); // Salida [1, 2, 10]
En el ejemplo anterior, se define un objeto defaultObj
en la función y las propiedades que contiene se usan como los valores predeterminados de los parámetros. Luego, Object.assagin () se usa para fusionar el objeto entrante y el objeto predeterminado. Las propiedades en defaultObj serán Los mismos atributos de obj se anulan. Si hay otros atributos en obj, se asignarán a defaultObj. Aquí se utiliza una variable para recibir el objeto combinado devuelto.
Al mismo tiempo, el valor predeterminado del parámetro formal obj
también se establece en un objeto vacío para evitar que se pasen parámetros cuando se llama a la función, porque esto hará que el segundo parámetro recibido por Object.assign() undefined
esté definido , lo que genera un error.
Los valores predeterminados de los parámetros y las asignaciones de desestructuración se utilizan juntos
Cuando se llama a una función, la coincidencia de parámetros reales y parámetros formales es en realidad un proceso de asignación implícito. Por lo tanto, el paso de parámetros también se puede deconstruir y asignar:
función fn({ x, y = 2, z = 3 }) { console.log([x, y, z]); } fn({}); // Salida [indefinido, 2, 3] fn({ x: 1, z: 10 }); // Salida [1, 2, 10]
En este ejemplo, solo se usa el valor predeterminado de la asignación desestructurante del objeto y no se usa el valor predeterminado del parámetro de función. Si no se pasan parámetros cuando se llama a la función, también se informará un error, porque esto hará que la asignación de desestructuración falle durante la inicialización de parámetros, lo que equivale a ejecutar código como {x, y = 2, z = 3} = undefined
.
De manera similar, puede usar la sintaxis de los valores predeterminados de los parámetros para establecer un objeto de desestructuración predeterminado para {x, y = 2, z = 3}
, de modo que las funciones sin pasar parámetros se puedan ejecutar sin problemas:
función fn({ x, y = 2, z = 3 } = {}) { console.log([x, y, z]); } fn(); // salida [indefinido, 2, 3]
Aquí hay dos valores predeterminados, lo que puede resultar un poco confuso. Así que utilice un pseudocódigo para explicar el proceso de inicialización de parámetros anterior:
if(parámetros reales=== {...}) { // cuando fn({...}); { x, y = 2, z = 3 } = {...}; } else if (parámetro real === indefinido){ // cuando fn(); { x, y = 2, z = 3 } = {}; }
Hay un detalle que requiere especial atención en los valores predeterminados dobles, que es la diferencia entre el valor predeterminado de la asignación desestructurante y el valor predeterminado del parámetro de función. Consulte el siguiente ejemplo:
función fn ({ x = 1 } = {}, { y } = { y: 2 }){ consola.log(x, y); } fn(); // Salida 1 2 fn({ x: 10 }, { y: 20 }); // Salida 10 20 fn({},{}); // 1 indefinido
En esta función, hay dos conjuntos de parámetros que utilizan asignación desestructurante. Parece que tanto x como y tienen valores predeterminados establecidos. Aunque son dos formas diferentes, los resultados obviamente no son los mismos en todos los casos. Cuando el parámetro pasado es {}
, y no obtiene el valor predeterminado 2. ¿A qué se debe esto? Combinado con el ejemplo de pseudocódigo anterior:
fn({ x: 10 }, { y: 20 }); // Durante la inicialización: { x = 1 } = { x: 10 }, { y } = { y: 20 } fn({},{}); // Durante la inicialización: { x = 1 } = {}, { y } = {}
Cuando el parámetro pasado es {}
, el parámetro de función no falta ni está undefined
, por lo que el valor predeterminado del parámetro de función no tiene ningún efecto. Al mismo tiempo, no hay valores correspondientes para x e y en {}
. El 1 obtenido por x es el valor predeterminado de la asignación de desestructuración, y y no tiene un valor predeterminado para la asignación de desestructuración, por lo que el valor predeterminado es undefined
.
Alcance y zona muerta temporal de los valores predeterminados de los parámetros
Hay otro pequeño detalle una vez que los parámetros se establecen en los valores predeterminados, formarán su propio alcance (envueltos en (...)
), por lo que no se puede hacer referencia a las variables en el cuerpo de la función:
función foo(a = b) { sea b = 1; } foo(); // Error, b no está definido
Pero este alcance es solo temporal. Una vez inicializados los parámetros, este alcance ya no existirá.
Se siguen también las reglas de los ámbitos ordinarios:
sea b = 2; función foo(a = b) { sea b = 1; devolver un; } foo(); // 2
En el ejemplo anterior, hay una variable global b, entonces el parámetro formal a obtendrá el valor de la variable global b.
Por supuesto, si hay un parámetro formal b en el alcance del parámetro formal, primero obtendrá el alcance actual:
sea b = 2; función foo(b = 3,a = b) { devolver un; } foo(); // 3
Establezca valores predeterminados para múltiples parámetros, se inicializarán en orden, siguiendo las reglas de la "zona muerta temporal", es decir, los parámetros anteriores no pueden hacer referencia a los parámetros posteriores:
función foo(a = b, b = 2) { devolver a + b; } foo(); // Error, no se puede acceder a b antes de la inicialización
parámetros restantes
ES6 proporciona la sintaxis de **parámetros restantes (resto)** ( ...变量名
), que puede recopilar parámetros reales redundantes de la función (es decir, parámetros reales que no corresponden a parámetros formales), de modo que no haya Necesito usar arguments
. Entendido. Si el parámetro formal se usa con el operador ...
, se convertirá en una matriz y los parámetros reales redundantes se colocarán en esta matriz.
Uso básico de los parámetros restantes:
función suma(a, ...valores) { for (sea val de valores) { a += valor; } devolver un; } suma(0, 1, 2, 3);
En el ejemplo anterior, durante la inicialización de parámetros, la coincidencia se realiza primero según la posición del parámetro, se asigna 0 a a y luego los parámetros restantes 1, 2 y 3 se colocarán en los valores de la matriz.
El siguiente es un ejemplo comparativo del uso de objetos arguments
y parámetros restantes para obtener parámetros:
// Cómo escribir argumentos function sortNumbers() { return Array.prototype.slice.call(argumentos).sort(); } // Cómo escribir los parámetros restantes const sortNumbers = (...numbers) => { devolver números.sort(); }
Se puede ver que los parámetros restantes están escritos de manera más concisa. Aunque arguments
es un objeto similar a una matriz y un objeto iterable, después de todo, no es una matriz. No admite métodos de matriz. Cuando usamos arguments
, si queremos llamar a un método de matriz, primero debemos usar Array.prototype.slice.call
para convertirlo en una matriz.
Los parámetros restantes son diferentes del objeto arguments
. Son instancias Array
reales y pueden usar fácilmente el método de matriz. Y las funciones de flecha también admiten el resto de parámetros.
Además, el uso de los parámetros restantes no afecta la funcionalidad del objeto arguments
; aún puede reflejar los parámetros pasados al llamar a la función.
La posición de los parámetros restantes.
El parámetro restante debe ser el último parámetro formal; de lo contrario, se informará un error.
// Función de informe de errores fn1(a, ...rest, b) { console.log([a, b, resto]); } //Forma correcta de escribir la función fn2(a, b, ...rest) { console.log([a, b, resto]); } fn2(1, 2, 3, 4) // Salida [1, 2, [3, 4]]
Expandir sintaxis
Anteriormente sabíamos cómo recopilar parámetros redundantes en una matriz, pero a veces necesitamos hacer lo contrario, como pasar los elementos de una matriz a una función por separado en lugar de pasar una matriz, como esto:
función suma(...valores) { sea suma = 0; for (sea val de valores) { suma += valor; } suma de devolución; } sea arr = [1, 2, 3, 4]; suma(arr); // "01,2,3,4"
La función en el ejemplo anterior acumulará todos los valores pasados. Si la pasamos directamente en una matriz, no obtendremos el resultado que queremos.
En el ejemplo, si se pasa una matriz, el valor de los valores se convertirá en [[1, 2, 3, 4]]
, lo que dará como resultado un solo elemento en los valores de la matriz, y el tipo de este elemento es una matriz. . Luego, el valor de retorno de la función es el resultado de sumar el valor 0
y la matriz [1, 2, 3, 4]
Los dos tipos se convierten implícitamente en cadenas y luego se suman. Es una concatenación de cadenas.
Para desmontar la matriz y pasarla a la función, primero es imposible pasar los parámetros uno por uno: sum(arr[0], arr[1], arr[2], arr[3]);
No siempre es posible saber cuántos elementos hay en la matriz y puede haber muchos elementos en la matriz. No es aconsejable pasarlo manualmente.
Es más factible utilizar el método apply():
suma.aplicar(nulo, arr); // 10
Pero esta aún no es la solución óptima, ¡así que aquí viene el punto clave!
La nueva **sintaxis de expansión (spread)** en ES6 puede ayudarnos a afrontar esta situación. También utiliza ...变量名
. Aunque es la misma que la sintaxis de parámetros restantes, su propósito es completamente opuesto. Puede dividir un objeto iterable en una secuencia de parámetros separados por comas.
Cuando se llama a la función, su aplicación es la siguiente:
suma(...arr); // 10 // Equivalente a suma(1,2,3,4);
Incluso se puede usar con valores regulares a voluntad, no hay restricciones en las posiciones delantera y trasera y se pueden pasar varios objetos iterables al mismo tiempo:
suma(-1, ...arr); // 9 suma(...arreglo, 5); // 15 suma(-1, ...arr, 5); suma(-1, ...arr, ...[5, 6, 7]);
El operador de expansión ...
equivale a completar la operación de pasar parámetros manualmente por separado para nosotros. La función solo sabe que los parámetros reales recibidos son valores individuales y no tendrán otros efectos debido a la existencia del operador de expansión.
Aunque todos los ejemplos anteriores son para matrices, la sintaxis de expansión puede hacer más que eso. Se pueden expandir otros objetos iterables, como cadenas y objetos literales. Para obtener más información, consulte → Sintaxis de expansión.
Los parámetros formales son variables locales declaradas en la función. Los parámetros reales pasados a la función se asignarán a los parámetros formales. La transferencia de parámetros de función es en realidad un proceso de asignación implícito.
El número de parámetros formales y parámetros reales puede no ser igual:
● Los parámetros formales a los que les faltan parámetros reales obtendrán el valor predeterminado undefined
.
● Se puede acceder a parámetros reales adicionales a través del objeto arguments
, excepto las funciones de flecha.
Puede pasar el objeto para que el orden de paso de los parámetros ya no sea importante y dejar que las propiedades del objeto se utilicen como parámetros reales.
Valor predeterminado del parámetro de ES6: el valor predeterminado se obtendrá solo si el valor del parámetro falta o undefined
cuando se llama a la función.
● Los parámetros que establecen valores predeterminados se pueden omitir sólo si se colocan en la última posición.
● El valor predeterminado de la configuración del parámetro formal no puede hacer referencia a las variables en el cuerpo de la función, pero puede hacer referencia a los parámetros formales anteriores y a las variables externas.
● La implementación de valores predeterminados a través de Object.assign() o la asignación desestructurada puede hacer que el método de pasar parámetros sea más flexible.
La principal diferencia entre los parámetros y arguments
restantes:
● Los parámetros restantes solo contienen aquellos parámetros reales que no tienen parámetros formales correspondientes, mientras que arguments
contiene todos los parámetros reales pasados a la función.
● Los parámetros restantes son instancias reales Array
, mientras que arguments
son simplemente objetos similares a matrices.
Tanto los parámetros restantes como la sintaxis de expansión utilizan ...
, en escenarios relacionados con funciones:
● Aparece al final de la lista de parámetros de función y es el parámetro restante.
● Ocurre en llamadas a funciones, es sintaxis de expansión.
Lo anterior es un artículo que explica los detalles de los parámetros en las funciones de JavaScript. Para obtener más información, preste atención a otros artículos relacionados en el sitio web chino de php.