基于面向对象的编程,是否还要深究闭包?
最近看了很多重新大谈关于闭包的资料,越看越不懂。
我们现在有了箭头函数,有了块级作用于,有了很多以前没有的方便开发的方法。而我所接触到的闭包应用,完全可以靠定义一个对象并操作其属性完成。
个人理解,闭包的价值在于其可以在不污染全局变量的前提下维持函数的作用域链,但是我看了很多例子,发现这些实现多数都可以靠定义一个对象完成。且对比下来,这些例子的代码易读性也特别可怕,this 套 _this 套 self 套 _self 实在可怕。
很多人也拿立即执行函数来讲闭包,然而立即执行函数其自身就有代码质量风险(分号问题)。
前几年还流行过谈函数式编程,结果却没流行起来,我倒觉得函数式编程更容易使用和维护。
为什么闭包却杀回马枪了?
可能我没有描述清楚啥是回马枪。
我最近接触的几个项目,原本都是定义对象之后操作对象来实现功能的,闭包这个概念并不放在台面上。
最近认识的几个人一直在大谈闭包,并且原本可以使用操作对象属性的一些功能设计全部改成了网上很容易搜到的 闭包使用 。代码易读性大打折扣。
项目中也是不推荐不同代码风格混用的。
如果在 对象操作 VS 闭包 两者之间进行排他性选择,到底该选哪个。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我的理解是,闭包是 JS 的底层技术之一.不管是用什么编程范式,都是初学者必须要掌握的基础.
在 JS 中函数是一等公民,可以当做参数传递和当做返回值.
平常编程会在大量的场景中使用这种方式,而这种方式就难免会遇到要处理闭包的情况,如果没有对闭包的理解,就很难得心应手的编程了.
程序员不止要写代码,很大一部分工作是在维护,这就要求能看懂别人的代码.很多技术就算我们不用,也需要去掌握,否则阅读别人的代码时就无法理解别人代码的意思.
学习一项技术,不仅仅是因为要用它,而是因为我们可以在了解他的原理之后,知道什么时候要用,什么时候不用,有什么风险,如何避免这些风险,以及出现问题时明白问题出现在哪里.
函数式编程好用.
回马枪这个没看懂,一个基础技术,初学者都逃不过,只要有人还在学 JS,就会有这方面的讨论吧,有可能是最近学到这部分知识的人突然变多了...
解决某一问题的方法通常都会有多种方案,每个人根据需要选择最合适自己就可以了.
使用闭包和使用对象在很多时候都可以达到一样的效果,他们相互之间经常可以相互替代.
如果是个人项目,就想用哪个用哪个.我可以在一个项目中全部使用对象,也可以全部使用闭包,还可以混着用.
如果是公司或者公共的项目,那就由对这个项目有影响力的人来决定.
至于怎么决定,要看具体的限制.
像易读性这种东西是很主观,并没有哪个是唯一的标准,主要看个人喜好.
如果要考虑性能的话,可能对象会比较合适.而如果考虑实现一个私有变量的话,可能闭包就更合适一点了.
还要看你对两者的理解,以及所使用环境的考虑.
我觉得你可以尝试沟通下,告诉他们你的想法,了解他们这么做的理由.当然如果你对这项目有足够的影响力,也可以直接否决这种写法,比如看到这种代码的时候,代码审查直接不给他通过
如果不听你的,一意孤行,你又没有足够的影响力的话,那就只能这样了.
身为一个前端 er 就是要能屈能伸,不挑食.
我觉得,JS是基于原型模型的语言,ES6虽然提供了类,但是底层还是基于原型继承去实现的;另外,箭头函数也是个语法糖,利用的就是闭包的特性,所以想用好JS,闭包是跳不过去的。
只要你还在使用匿名函数,不管是不是箭头函数,难免都要和闭包有关系。我相信大家写的绝大部分箭头函数都要访问函数外边的局部变量。
闭包这东西,本身是违反面向对象,也违反函数式编程,函数式编程里面函数应该没有副作用,闭包经常会导致副作用。
如果你使用的是
JavaScript
当然还是要深究的,另两位已经说的很好的,而就光拿楼主所说觉得函数式编程很好的这点来谈,就给自己的疑惑打了脸,要运用好JavaScript
高级的函数式编程,闭包是最重要基础之一。