高阶函数是接收函数为参数或返回函数的函数,如map、setTimeout、once;识别看形参是否含函数或是否return函数;常见错误包括丢参数、闭包变量捕获错、this丢失;curry和compose必须返回函数以支持延迟执行与复用。

高阶函数不是语法糖,而是 JavaScript 中函数作为一等公民的直接体现——只要一个函数接收函数作为参数,或返回函数作为结果,它就是高阶函数。你不需要“专门学”高阶函数,只需要在写 map、filter、debounce 或自己封装工具时,意识到参数里传进去的那个 callback 正在被当作值来传递和调用。
怎么一眼识别高阶函数
看函数签名:如果形参列表里出现函数(比如 fn、predicate、transform),或者函数体里有 return 一个函数表达式(如 return function() {...} 或 return () => {...}),基本可以确定是高阶函数。
-
Array.prototype.map(callback):callback是函数,map是高阶函数 -
setTimeout(handler, delay):handler是函数,setTimeout是高阶函数 -
const once = (fn) => { let called = false; return (...args) => { if (!called) { called = true; return fn(...args); } }; }:接收fn,返回新函数,是典型高阶函数
自己写高阶函数时最容易错的三件事
新手常把“能运行”当成“写对了”,但高阶函数出问题往往不报错,只是逻辑错位或闭包失效。
- 忘记用
...args转发参数:比如写const logWrapper = (fn) => () => { console.log('call'); fn(); },会丢失原始调用时的参数;正确写法是...args+fn(...args) - 在循环中创建闭包却没绑定当前值:比如
for (let i = 0; i console.log(i), 100)输出0 1 2没问题,但若用var或手动构造函数,i会变成3;高阶函数里若依赖循环变量,必须确保捕获的是当前迭代值 - 返回函数时没处理
this:如果原始fn是对象方法(如obj.method),直接wrap(obj.method)后调用,this会丢失;需用fn.bind(context)、call或箭头函数+显式传入上下文
为什么 curry 和 compose 必须返回函数
它们不是为了“看起来高级”,而是为了解耦调用时机与参数供给时机。
Android高手进阶教程(八)之----Android Widget开发案例(世界杯倒计时!),主要向大家讲解使用Android Widget如何编写出一款世界杯风格的倒计时程序,教程说出了制作步骤和代码。
立即学习“Java免费学习笔记(深入)”;
-
curry把多参数函数拆成单参数链式调用:const add = (a, b) => a + b; const add5 = curry(add)(5); add5(3); // 8—— 第二步返回的add5必须是函数,否则无法延迟执行 -
compose顺序组合函数:compose(f, g)(x)等价于f(g(x));它必须返回一个函数,因为组合结果本身不能立即执行(输入x还没给) - 如果不返回函数,就只能当场执行,失去复用性、配置性和管道化能力
真正难的不是写出一个返回函数的结构,而是在嵌套作用域里准确控制参数流、this 绑定和副作用时机——这些细节不会报错,但会让调试变得极难定位。









