-
Notifications
You must be signed in to change notification settings - Fork 80
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
闭包概念考证 #3
Comments
winter老师说得好 |
+1024 |
winter老师说的好 |
+1024 |
1024 |
“在JavaScript中,我们称函数对象为闭包。”,弱弱的问一句,一般的函数对象(例如这个空函数:function fd(){})也是闭包吗?精准的定义&来源没有研究过,只是现在人们讨论较多的“闭包“前提应该是“其所在环境内应该有一些自由变量的引用”吧? |
1024 |
@bosnma 是的,就如同[]也叫做数组没错吧? |
@AstralRoad @AKIo0O 俩初音…… |
要消化这个还得花点时间、 |
@wintercn 老师
这段话结合上面的概念,对闭包的认识就很清晰了。 |
Lexical Environment是个烂设计,极易造成内存泄漏。 |
学习了 |
|
总结得好棒~!!!!不过似乎有点细节方面的小问题:
如果将“封装在一起的过程和状态”理解为closure,那么所有OOP的对象都是closure,自然会比1975早,例如smalltalk。 狭义的、原始意义上的闭包其实实现得还更早些。函数定义时的“函数+环境”(也就是lexically scoped closure),在1962年的LISP 1.5中就已经实现,具体可参考LISP 1.5 Programmer's Manual,附录B里面apply和eval处理 |
bravo |
(https://www.zhoulujun.cn/html/webfront/ECMAScript/js/2015_0814_240.html 闲话闭包) 在离散数学(具体的说是抽象代数)里,如果对一个集合中的每个元素执行某个运算操作,得到的结果还是这个集合的元素,那么就说该集合在这个运算操作下构成闭包。例如,整数集合在减法运算下构成闭包;但是自然数在减法运算下不构成闭包。 封闭的定义 有了集合和运算的概念,就可以定义封闭的概念了。 |
闭包这个概念第一次出现在1964年的《The Computer Journal》上,由P. J. Landin在《The mechanical evaluation of expressions》一文中提出了applicative expression和closure的概念。(在计算机领域,closure还有两个完全不同的意义:计算几何中的凸包,和编译领域的包含集)
文中AE的概念定义如下:
简单翻译
在AE的基础上,闭包定义为
翻译如下
在1975年,Scheme最早实现了闭包。
60年代,因为受到函数式思维影响,计算机软件领域的"表达式"一般是包括λ表达式,也就是函数式语言中的函数的。所以这个闭包的定义在80年代后被更多过程式语言借鉴,其中包括C语言的static全局变量机制、C++的成员函数、JavaScript的局部函数。对于过程式语言中,因为很少有函数以外的"表达式",所以闭包这个概念更多被用于指函数。
在JavaScript中,我们称函数对象为闭包。根据ECMA-262规范,JavaScript的函数包含一个[[scope]]属性。[[scope]]指向scope chain(ECMA-262v3)或者Lexical Environment(ECMA-262v5)。这对应于闭包的环境部分,[[scope]]中可访问的属性列表即是标识符列表,对象本身的引用则对应于环境。控制部分即是函数对象本身了。
The text was updated successfully, but these errors were encountered: