闭包和对象的区别?

2021-01-08 17:48:15 +08:00
 asanelder
在看 js 的闭包, 感觉和面向对象中的对象差不多啊

闭包: 行为以及数据的绑定
对象: 行为以及数据的绑定

感觉没差啊, 是不是可以使用对象来代替闭包?
5857 次点击
所在节点    程序员
46 条回复
xiangbohua
2021-01-08 19:27:23 +08:00
我的理解中,闭包有两层含义:
一种是闭包的直接定义。
一种是实际编码中定义的函数。
我们通常说某种语言是否支持闭包的时候,我们用的第一层含义,当我们写出一个匿名函数用到闭包特性的时候,我们可以说我们写了一个闭包。
实际上,支持闭包的编程语言通常都支持、将一个方法或者函数当成参数传递,C#的委托、JS 的会调函数、Java 里面的匿名代码块等等。
我们经常会说到,函数或者方法能够跻身为某种语言里面一等公民的时候,通常也就支持闭包,那么此时我们定义的 C#的委托、JS 的会调函数、Java 里面的匿名代码块都已经是一个对象了。
所以:
我觉得,当我们说闭包是什么的时候,我们说的是一种定义,当我们讨论某个具体代码的时候我们讨论的是一个对象,只不过这个对象具有闭包特性。
以上
如果不正确请指正哈
xiangbohua
2021-01-08 19:28:12 +08:00
@ianva Java 现在已经有了额
darknoll
2021-01-08 21:08:40 +08:00
什么叫差不多?闭包是函数式编程及其核心思想“Lambda 计算法”( Lambda Calculus )的必备基本设定。js 不是面向对象的语言,好好看看函数式编程吧,别整天把啥东西都往面向对象那一套上边靠。
billlee
2021-01-08 21:49:40 +08:00
C++03 就是用类来代替闭包的
nthhdy
2021-01-08 21:58:52 +08:00
@darknoll lambda calculus 里面没有闭包的概念吧。闭包是在 scheme 语言里最初实现的,就是为了做到为 free variable 求值时到函数定义的环境中去找值,而不是到函数调用的环境里找。早期的 lisp 实现就是到函数调用环境里找的,据说 emacs lisp 到现在都是,导致写出来的代码非常反直觉。lambda calculus 里只有 application 和 abstraction,都没有现代编程语言里的“变量”这种东西。
asanelder
2021-01-08 22:10:24 +08:00
@xiangbohua #21 铁子的解释可以
walpurgis
2021-01-08 22:20:44 +08:00
闭包写习惯了根本懒得用 es6 class 语法,毕竟函数都作为变量满天飞了,函数返回函数再正常不过的事情了
ghostheaven
2021-01-08 22:24:58 +08:00
对象:带方法的数据
闭包:带数据的方法
ruyu
2021-01-08 22:30:59 +08:00
在一些语言中, 方法只是第一个参数是 this/self 的函数. 但闭包不是, 闭包是自带状态的.
gtx990
2021-01-08 22:41:42 +08:00
fp 爱好者也别啥都往 fp 上靠
secondwtq
2021-01-08 23:06:17 +08:00
"fp 爱好者“表示,可以去看一下 TAPL 的 “Imperative Objects” 这一章,这一章使用带简单 subtyping 以及 records,references,fix 操作符等基本扩展的 lambda calculus 对“面向对象”的基本行为进行了“approximation”。
我看的时候总有一种初学 JavaScript 的逮虾户 ...
但是最后最 tricky 的是 open recursion 的模拟(作者将 open recursion 归为 OOP 的“fundamental features”之一),这个是以前看 JS 教程的时候没有意识到的——这东西在大多数非 FP 语言里面几乎是天经地义的事情,我也 take it for granted 了 ...
FrankHB
2021-01-09 06:46:47 +08:00
@nthhdy 你自己都说 free variable 了,这不是变量是什么。
LC 的变量和现代编程语言中的一般意义上的变量(c.f. IEC 2382) 本来就是一回事,无非是默认共享命名空间无视作用域规则。把变量曲解为可变状态是历史上出现得晚得多的脑补,到现在仍然是片面的(按这说法纯 FP 语言里就没变量了)。
@secondwtq 实现所谓的 open recursion 不需要 OOP 。
名称解析直接整个 late binding 就行。不少动态语言的函数体里就是这样做的,函数定义时不管,拖到调用时才确定自然就 open 了,缺的只是没给在对象语言构造捕获环境(能够让你引用 this 这样的东西)的方法罢了。
darknoll
2021-01-09 10:48:41 +08:00
就说了些上学学过的东西就变成了 fp 爱好者,真棒
faceRollingKB
2021-01-09 13:23:52 +08:00
@asanelder 有了 class 以及 module,闭包基本就不需要了,但实践中还是会偶尔用用,使用场景还是有的
user8341
2021-01-10 10:43:35 +08:00
@faceRollingKB
es6 怎么定义私有属性?
looking0truth
2021-01-10 20:49:50 +08:00
@user8341 es2020,变量名前加#号
yaphets666
2021-01-10 21:56:03 +08:00
@walpurgis 日常哪里会用到闭包呢? 不是库里头应用的 是自己写代码的时候 实现什么功能会用到闭包呢?
user8341
2021-01-11 05:13:33 +08:00
@looking0truth 嗯。es2020 是 es11 了,不是 es6 。这么说 es6 应该是没有此功能的。
brust
2021-01-11 09:46:29 +08:00
czq?
faceRollingKB
2021-01-11 12:15:15 +08:00
@user8341 好吧,平时太依赖 ts 、babel 了,没注意这个问题,my bad

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/743103

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX