JS创造闭包的目的是为了模仿C# java那样来实现面向对象吗

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

阅读 6k
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 学来的还比较合理一点。

关于 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. 闭包的目的?
    答:根据词法作用域的规则,我们在函数外部是无法访问函数内部的数据的。所以使用函数返回的闭包能间接访问函数的内部数据。

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

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

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

不是,

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题