扫码关注官方订阅号
JS创造闭包的目的,是为了能像C#,java那样,用闭包来模拟面向对象吗? 比如:我们创建闭包的过程其实就很像 c# java 中 类实例化一个对象的过程。
走同样的路,发现不同的人生
假设没有闭包,你认为下面这个函数应该怎么运行呢?
function getExecutor(int base) { return function() { return base * 100; } } var e = getExecutor(23); console.log(e());
注意:假设没有闭包
这种情况下你可能会认为返回值是 NaN,当然也不排除有一些人会认为是 2300。
NaN
2300
那么,假设 getExecutor() 的定义是在某个库中,写个这库的人会不会想到 getExecutor() 返回的函数,其执行的时候所在的作用域中有没有定义一个 base 呢,它又不是不个数呢?
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个关键点需要理清楚:
闭包是什么?答:闭包是基于词法作用域书写代码时所产生的自然结果。(《你不知道的JavaScript上卷P44》)
怎样会产生闭包?答:无论使用何种手段将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用(这个引用叫闭包),无论在何处执行这个函数都会使用闭包。(《你不知道的JavaScript上卷P45》)
闭包的目的?答:根据词法作用域的规则,我们在函数外部是无法访问函数内部的数据的。所以使用函数返回的闭包能间接访问函数的内部数据。
所以,并不是题主理解的闭包是类实例化一个对象的过程。
闭包是附有数据的行为,对象是附有行为的数据,分别是OP和FP里常用的数据封装方式。与其说JS创造闭包的目的是来模拟面向对象,不如说是引入闭包(闭包的概念比JS早很多,闭包的信息隐匿,惰性求值能力早在scheme中就实现了)来丰富(另一个是prototype)JS的数据抽象和封装能力。:)题主不要中了面向对象的毒啊,多了解了解FP语言,“实例化”真的不是全部。
反正我一直理解成:解决了变量污染,可以私有化成员。保证作用域内的变量不被外部复写、更改。
不是,
这是函数式编程的必然结果,函数式编程要求必须支持闭包,否则没法实现这种编程思想,而 JAVA C# 曾经甚至到现在都不能说支持函数式编程。JS 面向对象就是 原型链 是借鉴的 scheme(好想是这个,我回头查一下) 的对象继承方式。虽然现在大家觉得这种方式好想满足不了我们的需要,或是不如JAVA C# 那样方便。
JAVA
C#
原型链
scheme
写成闭包的形式只能算是一种设计模式,就是说,大家通过实践,发现某些这样写比较好,所以大家都这样写。至于好处和缺点么,自行百度就好了,我自己也想不了多全面。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
假设没有闭包,你认为下面这个函数应该怎么运行呢?
这种情况下你可能会认为返回值是
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个关键点需要理清楚:
闭包是什么?
答:闭包是基于词法作用域书写代码时所产生的自然结果。(《你不知道的JavaScript上卷P44》)
怎样会产生闭包?
答:无论使用何种手段将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用(这个引用叫闭包),无论在何处执行这个函数都会使用闭包。(《你不知道的JavaScript上卷P45》)
闭包的目的?
答:根据词法作用域的规则,我们在函数外部是无法访问函数内部的数据的。所以使用函数返回的闭包能间接访问函数的内部数据。
所以,并不是题主理解的闭包是类实例化一个对象的过程。
闭包是附有数据的行为,对象是附有行为的数据,分别是OP和FP里常用的数据封装方式。
与其说JS创造闭包的目的是来模拟面向对象,不如说是引入闭包(闭包的概念比JS早很多,闭包的信息隐匿,惰性求值能力早在scheme中就实现了)来丰富(另一个是prototype)JS的数据抽象和封装能力。
:)题主不要中了面向对象的毒啊,多了解了解FP语言,“实例化”真的不是全部。
反正我一直理解成:解决了变量污染,可以私有化成员。保证作用域内的变量不被外部复写、更改。
不是,
这是函数式编程的必然结果,函数式编程要求必须支持闭包,否则没法实现这种编程思想,而
JAVA
C#
曾经甚至到现在都不能说支持函数式编程。JS 面向对象就是
原型链
是借鉴的scheme
(好想是这个,我回头查一下) 的对象继承方式。虽然现在大家觉得这种方式好想满足不了我们的需要,或是不如JAVA
C#
那样方便。写成闭包的形式只能算是一种设计模式,就是说,大家通过实践,发现某些这样写比较好,所以大家都这样写。
至于好处和缺点么,自行百度就好了,我自己也想不了多全面。