高阶函数
特点一 函数可以作为参数
// 手写一个forEachconst myForEach = (array, fn) => { for (let i = 0; i < array.length; i++) { fn(array[i]); }};const arr = [1, 5, 6, 3, 32, 42];myForEach(arr, (item) => { console.log(item);});// 手写一个 filterconst myFilter = (array, fn) => { const results = []; for (let i = 0; i < array.length; i++) { if (fn(array[i])) { results.push(array[i]); } } return results;};const evenNum = myFilter(arr, (item) => { return item % 2 !== 0;});console.log(evenNum);
特点二 函数可以作为返回值
// 函数可以作为返回值const demoFn = () => { return (str) => { console.log(str); };};demoFn()("Hello !");// 仿写 loadsh 的 once 函数const myOnce = function (fn) { let flag = false; return function () { if (!flag) { flag = true; fn.apply(this, arguments); } };};const payFn = myOnce((money) => { console.log(`您支付了 ${money} RMB`);});payFn(5);payFn(15);payFn(45);