代码展示

class Person {
    constructor(name, age) {
        this.name = name
        this.age = age
    }
}

const personArr = [
    new Person("孙悟空", 18),
    new Person("沙和尚", 38),
    new Person("红孩儿", 8),
    new Person("白骨精", 16),
]

function filter(arr, cb) {
    const newArr = [] 

    for (let i = 0; i < arr.length; i++) { 
        if (cb(arr[i])) {   
            newArr.push(arr[i]) 
        }
    }

    return newArr 
}


result = filter(personArr, a => a.name === "孙悟空") 
result = filter(personArr, a => a.age >= 18)

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = filter(arr, a => a % 2 === 0)

console.log(result)
function someFn() {
    return "hello"
}

function outer(cb){
    return () => {
        console.log("记录日志~~~~~")
        const result = cb()
        return result
    }
}

let result = outer(someFn)

// console.log(result)


function test(){
    console.log("test~~~~")
    return "test"
}

let newTest = outer(test)

newTest()

第一个代码片段(filter 函数)

这个片段定义了一个 filter 函数,它接受一个数组和一个回调函数作为参数。

filter 函数遍历数组,对每个元素调用回调函数进行测试,然后返回一个新数组,其中包含所有通过测试的元素。这个功能类似于 JavaScript 内置的 Array.prototype.filter 方法。

function filter(arr, cb) {
    const newArr = [];
    for (let i = 0; i < arr.length; i++) {
        if (cb(arr[i])) {
            newArr.push(arr[i]);
        }
    }
    return newArr;
}

第二个代码片段(outer 函数)

这个片段定义了一个 outer 函数,它接受一个回调函数 cb 作为参数,并返回一个新的函数。

这个新函数在执行时会先记录日志,然后调用 cb 并返回其结果。这个模式通常用于在函数执行前后添加额外的逻辑,例如日志记录、性能监控等。

function outer(cb) {
    return () => {
        console.log("记录日志~~~~~");
        const result = cb();
        return result;
    };
}

不同点

  1. 用途不同

    • filter 函数用于数组过滤,生成一个新数组。

    • outer 函数用于在回调函数执行前后添加额外的逻辑。

  2. 参数和返回值

    • filter 接受一个数组和一个回调函数作为参数,返回一个新数组。

    • outer 接受一个回调函数作为参数,返回一个新的函数。

  3. 实现细节

    • filter 内部使用 for 循环遍历数组,并根据回调函数的返回值决定是否将元素添加到新数组中。

    • outer 返回一个新的匿名函数,该函数在执行时会先记录日志,然后调用并返回回调函数的结果。