Git Product home page Git Product logo

Comments (17)

AKIo0O avatar AKIo0O commented on September 3, 2024

winter老师说得好

from blog.

haosdent avatar haosdent commented on September 3, 2024

+1024

from blog.

AstralRoad avatar AstralRoad commented on September 3, 2024

winter老师说的好

from blog.

Bosn avatar Bosn commented on September 3, 2024

+1024

from blog.

 avatar commented on September 3, 2024

1024

from blog.

Bosn avatar Bosn commented on September 3, 2024

“在JavaScript中,我们称函数对象为闭包。”,弱弱的问一句,一般的函数对象(例如这个空函数:function fd(){})也是闭包吗?精准的定义&来源没有研究过,只是现在人们讨论较多的“闭包“前提应该是“其所在环境内应该有一些自由变量的引用”吧?

from blog.

wuye9036 avatar wuye9036 commented on September 3, 2024

1024

from blog.

wintercn avatar wintercn commented on September 3, 2024

@bosnma 是的,就如同[]也叫做数组没错吧?

from blog.

wintercn avatar wintercn commented on September 3, 2024

@AstralRoad @AKIo0O 俩初音……

from blog.

XinHu0101 avatar XinHu0101 commented on September 3, 2024

要消化这个还得花点时间、

from blog.

switer avatar switer commented on September 3, 2024

@wintercn 老师

[[scope]]指向scope chain(ECMA-262v3)或者Lexical Environment(ECMA-262v5)。这对应于闭包的环境部分,
[[scope]]中可访问的属性列表即是标识符列表,对象本身的引用则对应于环境。控制部分即是函数对象本身了。

这段话结合上面的概念,对闭包的认识就很清晰了。

from blog.

Atry avatar Atry commented on September 3, 2024

Lexical Environment是个烂设计,极易造成内存泄漏。

from blog.

ericdum avatar ericdum commented on September 3, 2024

学习了

from blog.

alanwei43 avatar alanwei43 commented on September 3, 2024

闭包是由函数和与其相关的引用环境组合而成的实体

原文

from blog.

wlnirvana avatar wlnirvana commented on September 3, 2024

总结得好棒~!!!!不过似乎有点细节方面的小问题:

在1975年,Scheme最早实现了闭包。

如果将“封装在一起的过程和状态”理解为closure,那么所有OOP的对象都是closure,自然会比1975早,例如smalltalk。

狭义的、原始意义上的闭包其实实现得还更早些。函数定义时的“函数+环境”(也就是lexically scoped closure),在1962年的LISP 1.5中就已经实现,具体可参考LISP 1.5 Programmer's Manual,附录B里面apply和eval处理FUNARGFUNCTION的情况即是lexical closure。

from blog.

anfa1014 avatar anfa1014 commented on September 3, 2024

bravo

from blog.

zhoulujun avatar zhoulujun commented on September 3, 2024

(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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.