javascript - JS创造闭包的目的是为了模仿C# java那样来实现面向对象吗
怪我咯
怪我咯 2017-04-10 15:46:22
[JavaScript讨论组]

JS创造闭包的目的,是为了能像C#,java那样,用闭包来模拟面向对象吗?
比如:我们创建闭包的过程其实就很像 c# java 中 类实例化一个对象的过程。

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(7)
迷茫

假设没有闭包,你认为下面这个函数应该怎么运行呢?

function getExecutor(int base) {
    return function() {
        return base * 100;
    }
}

var e = getExecutor(23);
console.log(e());

注意:假设没有闭包

这种情况下你可能会认为返回值是 NaN,当然也不排除有一些人会认为是 2300

那么,假设 getExecutor() 的定义是在某个库中,写个这库的人会不会想到 getExecutor() 返回的函数,其执行的时候所在的作用域中有没有定义一个 base 呢,它又不是不个数呢?

又或者,库开发者本意是希望作用域中有一个数值类型的 base,但使用者完全不知道有这个前提呢……

既然没有闭包会有这么多的不定因素造成问题,那干脆就用一个闭包解决好啦。这样谁也不用猜,大家都明白。

所以闭包最初发明的时候,有可能只是为了解决语义的多义性问题,压根没想到大家能把它用到极致。

补充一下

虽然 JavaScript 比 Java 晚,但是比 C# 早,而且 Java 的闭包也是 Java 8 才添加的特性。所以说 C# 和 Java 的闭包是从 JavaScript 学来的还比较合理一点。

PHPz

关于 JS 中引入词法闭包的目的是啥,这个得问 Brenden Eich,附上他老人家的 twitter 账号:@BrendanEich,自己去问吧。

闭包和传统的 OO 都提供了数据封装的功能,从这个角度看,两者确实很像,所以有那么句话:“闭包是穷人的对象,对象是穷人的闭包”。

StackOverflow 上也有相关讨论:Closures are poor man's objects and vice versa

阿神

js只有函数作用域于是可以创造闭包..于是可以使用面向对象的思想 ...

个人觉得应该从这个角度来理解闭包.. 愚见.

伊谢尔伦

对于闭包,有3个关键点需要理清楚:

  1. 闭包是什么?
    答:闭包是基于词法作用域书写代码时所产生的自然结果。(《你不知道的JavaScript上卷P44》)

  2. 怎样会产生闭包?
    答:无论使用何种手段将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用(这个引用叫闭包),无论在何处执行这个函数都会使用闭包。(《你不知道的JavaScript上卷P45》)

  3. 闭包的目的?
    答:根据词法作用域的规则,我们在函数外部是无法访问函数内部的数据的。所以使用函数返回的闭包能间接访问函数的内部数据。

所以,并不是题主理解的闭包是类实例化一个对象的过程。

PHPz

闭包是附有数据的行为,对象是附有行为的数据,分别是OP和FP里常用的数据封装方式。
与其说JS创造闭包的目的是来模拟面向对象,不如说是引入闭包(闭包的概念比JS早很多,闭包的信息隐匿,惰性求值能力早在scheme中就实现了)来丰富(另一个是prototype)JS的数据抽象和封装能力。
:)题主不要中了面向对象的毒啊,多了解了解FP语言,“实例化”真的不是全部。

PHPz

反正我一直理解成:解决了变量污染,可以私有化成员。保证作用域内的变量不被外部复写、更改。

PHP中文网

不是,

这是函数式编程的必然结果,函数式编程要求必须支持闭包,否则没法实现这种编程思想,而 JAVA C# 曾经甚至到现在都不能说支持函数式编程。
JS 面向对象就是 原型链 是借鉴的 scheme(好想是这个,我回头查一下) 的对象继承方式。虽然现在大家觉得这种方式好想满足不了我们的需要,或是不如JAVA C# 那样方便。

写成闭包的形式只能算是一种设计模式,就是说,大家通过实践,发现某些这样写比较好,所以大家都这样写。
至于好处和缺点么,自行百度就好了,我自己也想不了多全面。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号