Comments (17)
winter老师说得好
from blog.
+1024
from blog.
winter老师说的好
from blog.
+1024
from blog.
1024
from blog.
“在JavaScript中,我们称函数对象为闭包。”,弱弱的问一句,一般的函数对象(例如这个空函数:function fd(){})也是闭包吗?精准的定义&来源没有研究过,只是现在人们讨论较多的“闭包“前提应该是“其所在环境内应该有一些自由变量的引用”吧?
from blog.
1024
from blog.
@bosnma 是的,就如同[]也叫做数组没错吧?
from blog.
@AstralRoad @AKIo0O 俩初音……
from blog.
要消化这个还得花点时间、
from blog.
@wintercn 老师
[[scope]]指向scope chain(ECMA-262v3)或者Lexical Environment(ECMA-262v5)。这对应于闭包的环境部分,
[[scope]]中可访问的属性列表即是标识符列表,对象本身的引用则对应于环境。控制部分即是函数对象本身了。
这段话结合上面的概念,对闭包的认识就很清晰了。
from blog.
Lexical Environment是个烂设计,极易造成内存泄漏。
from blog.
学习了
from blog.
闭包是由函数和与其相关的引用环境组合而成的实体
from blog.
总结得好棒~!!!!不过似乎有点细节方面的小问题:
在1975年,Scheme最早实现了闭包。
如果将“封装在一起的过程和状态”理解为closure,那么所有OOP的对象都是closure,自然会比1975早,例如smalltalk。
狭义的、原始意义上的闭包其实实现得还更早些。函数定义时的“函数+环境”(也就是lexically scoped closure),在1962年的LISP 1.5中就已经实现,具体可参考LISP 1.5 Programmer's Manual,附录B里面apply和eval处理FUNARG
和FUNCTION
的情况即是lexical closure。
from blog.
bravo
from blog.
(https://www.zhoulujun.cn/html/webfront/ECMAScript/js/2015_0814_240.html 闲话闭包)
维基百科上对闭包的解释就很经典:
在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。 Peter J. Landin 在1964年将术语闭包定义为一种包含环境成分和控制成分的实体。
百度百科:
闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。在 Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python、Go、Lua、objective c、swift 以及Java(Java8及以上)等语言中都能找到对闭包不同程度的支持。
在离散数学(具体的说是抽象代数)里,如果对一个集合中的每个元素执行某个运算操作,得到的结果还是这个集合的元素,那么就说该集合在这个运算操作下构成闭包。例如,整数集合在减法运算下构成闭包;但是自然数在减法运算下不构成闭包。
封闭的定义
有了集合和运算的概念,就可以定义封闭的概念了。
非正式地,如果定义于集合A上的运算+的运算结果仍然属于A,那么运算+对于集合A是封闭的。下面给出“封闭”的一个半形式化定义:
如果对于任意a1,a2∈A,有a1+a2∈A,那么说二元运算+对于集合A是封闭的。(⊙,+ 与”,“或”)
例如“+”对于N+是封闭的,因为任意两个正整数的和结果仍然是正整数;但是“>”对于N+不是封闭的,例如3和5属于N+,但是:3>5=>2∉N+。
闭包性质
一个集合满足闭包性质当且仅当这个集合在某个运算或某些运算的搜集下是封闭的,其中“某些运算的搜集下封闭”是指这个集合单独闭合在每个运算之下。
值得一提的是,之前这条定义往往被作为一条公理引入一个代数结构,叫做“闭包公理”。但是现代集合论往往将运算形式化的定义为集合间的运算,所以将其作为公理引入代数结构是多余的(因为可以通过其它公理间接定义闭包公理),但是对于子集是否闭合的问题,闭包公理仍然有意义。
from blog.
Related Issues (11)
- 响应式设计 HOT 25
- 一种全新的UI架构——HSEJ模式 HOT 33
- 关于webp的请教 HOT 2
- pp HOT 1
- 谈谈面试与面试题 HOT 56
- 阿里巴巴无线前端团队 HOT 141
- 谈谈UI架构设计的演化 HOT 5
- HTML中的attribute和property HOT 1
- 谈谈面试与面试题 II HOT 3
- 手淘的滚动组件叫什么 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from blog.