为什么说Javascript函数是一等公民及其函数式编程实践?
发布时间 - 2026-01-10 00:00:00 点击率:次JavaScript中函数是一等公民,可赋值、传参、返回和存储;高阶函数如map/filter/reduce及pipe等是解决实际问题的工具,纯函数需满足相同输入得相同输出且无副作用。
因为 JavaScript 中的函数能像数字、字符串一样被赋值、传参、返回和存储——这是“一等公民”的全部定义,不是修辞,而是语言底层能力。
函数能当变量用,是所有实践的起点
这不是语法糖,而是运行时真实行为:函数对象可随时被引用、重赋值、放进数组或对象里。一旦理解这点,就自然跳出“函数只能声明后调用”的思维定式。
- 错误写法:
function sayHi() { console.log('Hi') }然后试图typeof sayHi === 'function'是对的,但若没赋值给变量,它只是全局作用域的一个绑定,无法动态传递 - 正确姿势:
const sayHi = () => console.log('Hi');或const handlers = { click: sayHi, submit: () => alert('done') }; - 常见坑:把匿名函数直接塞进
addEve又想 later 移除?不行——没引用就无法
ntListenerremoveEventListener,必须先存成变量
高阶函数不是概念,是每天都在写的代码
map、filter、reduce 都是高阶函数,它们接收函数作为参数;once、debounce、pipe 都返回函数——这些不是 FP 专属玩具,而是解决实际问题的工具。
-
filter不改原数组,但你自己写的filterByAge(arr, min)若用arr.splice()就破坏了不可变性,不再是纯函数 -
pipe的实现很短,但能让逻辑线性可读:const pipe = (...fns) => (x) => fns.reduce((v, f) => f(v), x);
- 别在循环里反复定义函数(比如
for (...) arr.push(() => {...})),闭包捕获的是同一份变量,容易引发意料外的引用问题
纯函数不是道德要求,而是可预测性的保障
所谓“相同输入 → 相同输出 + 无副作用”,本质是为了让函数行为不依赖外部状态,方便测试、复用和组合。
- 反例:
const now = () => Date.now()每次调用结果不同,无法缓存、无法单元测试断言 - 正例:
const formatTime = (timestamp, fmt) => ...所有依赖都显式传入,哪怕fmt是默认值,也建议用参数而非闭包捕获 - 容易忽略的副作用:修改传入的对象属性(
obj.name = 'new')、发请求、console.log—— 这些都会让函数脱离“纯”的范畴,影响组合可靠性
真正卡住人的往往不是“怎么写 pipe”,而是忘记函数作为值时的生命周期管理——比如事件监听器没清理、闭包长期持有大对象、setTimeout 回调里还引用着已卸载组件的 this。一等公民的权利越大,责任越具体。
# javascript
# java
# 工具
# 作用域
# 为什么
# red
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在Windows服务器上快速搭建网站?
Python文件异常处理策略_健壮性说明【指导】
如何挑选最适合建站的高性能VPS主机?
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
简历没回改:利用AI润色让你的文字更专业
微信小程序 canvas开发实例及注意事项
香港服务器部署网站为何提示未备案?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
北京企业网站设计制作公司,北京铁路集团官方网站?
高端企业智能建站程序:SEO优化与响应式模板定制开发
js代码实现下拉菜单【推荐】
微信公众帐号开发教程之图文消息全攻略
专业商城网站制作公司有哪些,pi商城官网是哪个?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
WordPress 子目录安装中正确处理脚本路径的完整指南
如何为不同团队 ID 动态生成多个独立按钮
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
Java类加载基本过程详细介绍
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
C++用Dijkstra(迪杰斯特拉)算法求最短路径
iOS UIView常见属性方法小结
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
Laravel怎么在Blade中安全地输出原始HTML内容
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
Laravel如何记录自定义日志?(Log频道配置)
网站制作大概多少钱一个,做一个平台网站大概多少钱?
Python正则表达式进阶教程_复杂匹配与分组替换解析
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
常州企业网站制作公司,全国继续教育网怎么登录?
Laravel怎么调用外部API_Laravel Http Client客户端使用
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
Laravel如何使用模型观察者?(Observer代码示例)
如何在腾讯云服务器快速搭建个人网站?
Thinkphp 中 distinct 的用法解析
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
如何快速生成可下载的建站源码工具?
Laravel distinct去重查询_Laravel Eloquent去重方法
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
Python图片处理进阶教程_Pillow滤镜与图像增强
如何生成腾讯云建站专用兑换码?
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
如何用PHP快速搭建高效网站?分步指南
魔方云NAT建站如何实现端口转发?
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
JS弹性运动实现方法分析
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】


ntListener