¿Puede explicar cómo los argumentos se pasan automáticamente en las funciones de devolución de llamada?
1. const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 2. arr.sort(comFunc); 3. /* how arugments 'a' and 'b' are passed inside comFunc in sort() function */ 4. function comFunc(a, b){ 5. return b - a; 6. } 7. arr.forEach((item)=>{ 8. console.log(item); 9. })En el código anterior, estoy confundido sobre cómo a y b se pasan automáticamente como argumento dentro de sort(). ¿Puedes explicar la segunda línea en el código de cómo comFunc obtiene sus argumentos?
La función Array.prototype.sort iterará a través de la matriz, pasando los valores en el índice actual (a) y el siguiente índice (b) a la función de devolución de llamada que proporcionó.
Según su ejemplo anterior, debería hacer las siguientes llamadas por iteración
0: a = 1; b = 2 1: a = 2; b = 3 2: a = 3; b = 4 ...Su comFunc es una variable con tipo Función . Será llamado más tarde por el método de sort internamente y ellos se encargarán de pasar los parámetros con los valores apropiados.
Aquí hay un ejemplo más simple ya que sort es un poco complicado. En su lugar, veamos la función Array.filter :
El método filter() crea una nueva matriz con todos los elementos que pasan la prueba implementada por la función proporcionada.
Podemos implementar tal función como esta:
function filter(arr, filterFunction) { const result = []; for (let item of arr) { if (filterFunction(item)) { result.push(item); } } return result; }Al crear la función, no sabe con qué "desarrollador final" desea filtrar. Por lo tanto, permite que el desarrollador pase una función, y es trabajo del desarrollador asegurarse de que sea una función que acepte un elemento y devuelva un resultado booleano. Nuestro trabajo es pasar el elemento y actuar en consecuencia con el resultado. Por ejemplo:
const arr = [1,10,5,3,2]; const filteredArr = filter(arr, require5OrMore); function require5OrMore(item) { return item >= 5; } // filterArr now contains only items that are >= 5 (10 and 5)Tenga en cuenta que, en realidad, el código anterior se puede simplificar utilizando la función anónima y/o de flecha :
const filteredArr = filter(arr, item => item >= 5); Ahora, si aún no puede entender por qué está sucediendo, puede colocar algún punto de interrupción en la función de filter anterior y la función require5OrMore y verificar los valores a medida que el código se ejecuta a través de él.