
因为 javascript 中的函数可以像普通值一样被赋值、传参、返回和存储,所以它是一等公民。这种设计让函数不再只是“执行一段代码的工具”,而是真正参与程序数据流的核心角色。
能赋值给变量和属性
函数可以像字符串或数字一样,直接赋给变量、对象属性甚至数组元素。这打破了传统语言中“函数必须有名字且独立存在”的限制。
- let greet = function() { console.log(“Hello”); }; —— 匿名函数存入变量
- const obj = { action: function() { return “done”; } }; —— 函数作为对象方法动态挂载
- const handlers = [() => 1, (x) => x * 2]; —— 多个函数存进数组,统一调度
能作为参数传递(高阶函数)
函数可以当参数传给另一个函数,这是实现抽象、复用和定制行为的基础。比如数组的 map、Filter、reduce 全都依赖这一点。
- [1, 2, 3].map(x => x ** 2) —— 把计算逻辑交给调用者决定
- setTimeout(() => alert(“done”), 1000) —— 延迟执行的具体动作由你提供
- 自定义封装:function retry(fn, times) { /* 调用 fn 若失败则重试 */ } —— fn 就是传入的行为本身
能从函数中返回函数(闭包与工厂)
返回函数不仅支持状态封装,还能生成行为一致但配置不同的新函数,天然适配“配置即代码”场景。
立即学习“Java免费学习笔记(深入)”;
- const makeAdder = (n) => (x) => x + n;
const add5 = makeAdder(5); add5(3); // 8 - const logger = (prefix) => (msg) => console.log(`[${prefix}] ${msg}`);
const ErrorLog = logger(“ERROR”); errorLog(“file not found”); - react 中的 useCallback 和自定义 Hook 本质也是靠返回函数来维持引用稳定性和逻辑复用
能参与表达式和即时执行
函数可以出现在任何表达式位置,包括立即执行(IifE)、三元运算、逻辑运算中,让控制流更紧凑、副作用更可控。
- (function(){ return “IIFE”; })(); —— 避免污染作用域
- const result = condition ? () => doA() : () => doB(); result();
- button.onclick = isEdit ? saveHandler : cancelHandler; —— 行为切换无需 if/else 块
基本上就这些。函数作为一等公民不是炫技,而是让 js 能自然支撑回调、事件驱动、函数式编程、状态管理、DSL 构建等常见需求——不复杂但容易忽略它的底层分量。