闭包和对象的区别?

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

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

感觉没差啊, 是不是可以使用对象来代替闭包?
5825 次点击
所在节点    程序员
46 条回复
ConradG
2021-01-08 17:53:07 +08:00
本来俩就是一个东西——方法执行上下文
fpure
2021-01-08 17:53:26 +08:00
闭包是穷人的对象,对象是穷人的闭包
你可以用闭包来模拟对象,或者用对象来模拟闭包,除非有必要的话
asanelder
2021-01-08 17:55:32 +08:00
@ConradG #1
@fpure #2

是啊, 记得之前看过很多讲这个的文章, 感觉说的很不明觉厉, 今天又仔细看了一下,感觉和对象差不多.

什么保存上下文环境, 驻留在内存中, 这不就是对象么.
asanelder
2021-01-08 17:56:17 +08:00
同一个东西, 使用闭包和对象来实现, 感觉也差不多.


```javascript
function createIncrementor(start) {
return function () {
return start++;
};
}

var inc = createIncrementor(5);

inc() // 5
inc() // 6
inc() // 7
```

```java
class Incrementor {
private int start;

Incrementor(int start) {
this.start = start;
}

int inc() {
start++;
}

}
```
codehz
2021-01-08 18:01:55 +08:00
是这样的,你可以
function Class() {
let x = 1;
let y = 2;
return function(action, params) {
switch(action) {
case "get-x": return x; break;
case "set-x": x = params[0]; break;
case "get-y": return y; break;
case "set-y": y = params[0]; break;
default: throw new Error("not implemented");
}
}
}
然后
let instance = Class()
console.log(instance("get-x")); // 1
instance("set-x", [5]);
console.log(instance("get-x")); // 5
顺带提示,这种方法还可以实现继承,多态等其他面向对象特性
fpure
2021-01-08 18:03:00 +08:00
别想的太复杂,闭包就是用来解决返回一个函数之后的上下文问题,而对象就是通常用来组织数据的结构;本质都是存储状态;不用把他们想的太神秘,用的时候你自然就知道该用闭包还是对象了
asanelder
2021-01-08 18:08:21 +08:00
@fpure #6 嗯嗯, 主要是网上说的太高大上了, 之前心里有些害怕, 哈哈
codehz
2021-01-08 18:09:56 +08:00
对象代替闭包,在某些没有闭包的语言里也是可行的(前面看反了(
甚至没有类这种机制的情况下都是可行的方案
主要方法就是将局部变量变成对象属性,或者结构体属性
然后作为一个环境参数在多个普通函数之间传递即可
( c 库主流的设置回调函数要给一个 void*作为用户指针就是这样来的)
OxOzZ
2021-01-08 18:12:17 +08:00
SICP 第二章
SuperMild
2021-01-08 18:19:38 +08:00
话不能这么说,

自行车:代步工具
小轿车:代步工具

光看定义是感觉没差,但能不能相互代替?

一个比较轻,一个比较重;一个适用于简单(短距离)场境,一个适用于复杂(远距离)场境;一个结构简单,一个结构复杂。
ngn999
2021-01-08 18:40:42 +08:00
《代码的未来》里说: 对象与闭包是同一事物的正反两面.

https://www.cnblogs.com/edisonchou/p/4873315.html
ianva
2021-01-08 18:50:39 +08:00
真该看看 SICP,原本很简单的世界就是因为面向对象这一个抽象把东西都搞复杂了,java 缺少这种函数是一等公民这种最基本的规则
ianva
2021-01-08 18:54:53 +08:00
从面向对象的语言入门编程真会有很多偏见,SICP 选的 Scheme 这种精简到不能再精简的语言才能呈现编程的最原本的东西
ianva
2021-01-08 18:58:29 +08:00
asanelder
2021-01-08 19:04:33 +08:00
@ianva #14
@ianva #13
@ianva #12

嗯, 将来一定要好好拜读一下 SICP
Leviathann
2021-01-08 19:07:46 +08:00
闭包是穷人的对象
对象是穷人的闭包
faceRollingKB
2021-01-08 19:11:14 +08:00
es6 出现以前,js 没有私有属性 /方法的概念,这才有了闭包,利用作用域来实现私有
asanelder
2021-01-08 19:14:07 +08:00
@faceRollingKB #17 是不是 es6 出现后, 之前使用闭包的场景就大大减少了啊
ianva
2021-01-08 19:18:15 +08:00
所有函数式编程的场景都是靠闭包过的,这也是 JavaScript 最有用的特性了,举个例子 https://ramdajs.com/
特别是 es6 之后有箭头函数了,应用的就越来越广泛了
Cbdy
2021-01-08 19:18:22 +08:00
@asanelder 不是

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

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

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

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

© 2021 V2EX