【霏艺所思】什么是闭包?
Q:什么是闭包?
A:一种内部函数,用来访问内部变量。
这里注意到两个关键点:
1.它是一个函数
2.用途是访问内部变量
Q:为什么要使用闭包?
A:Javascript 类语言没有提供 C语言的引用功能。。。
开始本文的重点!
C/C++/Rust这些裸金属语言,支持一种叫引用的操作。
记作 int &a = b;
但是js这些语言不支持啊!就搞一个“闭包”来实现类似的功能,然后掩盖自己的缺陷。。。
js的缺陷,函数调用只能传值,不能传引用。每次调用函数,会创建一个新的作用域。
上层作用域,无法感知下层作用域。C语言可以在上层作用域创建内存,通过引用来传给下层,下层去操作上层创建的内存就可以了。那么js是先天不足。。。。
有人会说,不能传引用,传值不行么?
当然不行!很多问题:
1.调用函数的时候,函数内部操作完修改了变量是内部的作用域的拷贝,外层内存没有变化
2.浪费了内存
其实就是C语言语法的基础。。。
得明白为什么C语言要搞引用
明白了么?
闭包是为了解决某些语言不支持“引用”特性,自己给自己找台阶下的一个语法而已。。。
引用是为了省内存。闭包达到了类似的效果,但是性能开销却很大。。。少用!
----------------------------------------------
本文章时间来不及,日后补充
进入本文的重点章节,跨语言编程!【比如C++ 和 Python】
我写AI的代码,从python侧调用C++的函数,可以通过pybind
但是如果要操作内存怎么办?
因为不支持传递引用,所以我就传闭包给C++[所以你们看AI相关的代码,经常在C++侧看到闭包]
当然有更加Native的方法,就是传c++的指针给python
【不管是传闭包,还是传指针,我来不及写了,下次补上】
----------------------------------------------
本文章时间来不及,日后补充
进入本文的第二个重点章节,右值引用,完美转发!
作为裸金属语言,C++对性能的敲诈【应该是压榨】可谓丧心病狂~
上面那么多铺垫,是为了让你们明白什么叫引用,以及引用的好处
这样,你们才能明白,我接下来要说的东西
A:一种内部函数,用来访问内部变量。
这里注意到两个关键点:
1.它是一个函数
2.用途是访问内部变量
Q:为什么要使用闭包?
A:Javascript 类语言没有提供 C语言的引用功能。。。
开始本文的重点!
C/C++/Rust这些裸金属语言,支持一种叫引用的操作。
记作 int &a = b;
但是js这些语言不支持啊!就搞一个“闭包”来实现类似的功能,然后掩盖自己的缺陷。。。
js的缺陷,函数调用只能传值,不能传引用。每次调用函数,会创建一个新的作用域。
上层作用域,无法感知下层作用域。C语言可以在上层作用域创建内存,通过引用来传给下层,下层去操作上层创建的内存就可以了。那么js是先天不足。。。。
有人会说,不能传引用,传值不行么?
当然不行!很多问题:
1.调用函数的时候,函数内部操作完修改了变量是内部的作用域的拷贝,外层内存没有变化
2.浪费了内存
其实就是C语言语法的基础。。。
得明白为什么C语言要搞引用
明白了么?
闭包是为了解决某些语言不支持“引用”特性,自己给自己找台阶下的一个语法而已。。。
引用是为了省内存。闭包达到了类似的效果,但是性能开销却很大。。。少用!
----------------------------------------------
本文章时间来不及,日后补充
进入本文的重点章节,跨语言编程!【比如C++ 和 Python】
我写AI的代码,从python侧调用C++的函数,可以通过pybind
但是如果要操作内存怎么办?
因为不支持传递引用,所以我就传闭包给C++[所以你们看AI相关的代码,经常在C++侧看到闭包]
当然有更加Native的方法,就是传c++的指针给python
【不管是传闭包,还是传指针,我来不及写了,下次补上】
----------------------------------------------
本文章时间来不及,日后补充
进入本文的第二个重点章节,右值引用,完美转发!
作为裸金属语言,C++对性能的敲诈【应该是压榨】可谓丧心病狂~
上面那么多铺垫,是为了让你们明白什么叫引用,以及引用的好处
这样,你们才能明白,我接下来要说的东西
19 个评论
我竟然在品葱学习cs……~\(≧▽≦)/~
集合A的閉包closure就是所有包含A的閉集的交集。—topology
好像CS的閉包和數學的不一樣,CS不是應用數學嗎。
好像CS的閉包和數學的不一樣,CS不是應用數學嗎。
lambda n : (lambda n: (lambda a, b: b.reverse() or (lambda d: d.reverse() or ''.join(d))((lambda b, c: ([a[x][b[x] - 1] for x in range(len(b)) if b[x] != 0 ]) + c)(b if len(b) <= 3 else b[:3], [] if len(b) <= 3 else [a[-1][-1] * b[-1]])) )((lambda sgen: (lambda ra: [sgen(x, 0).split() + sgen(x, 1).split() for x in [ra[x: x+3] for x in range(0, len(ra) - 2, 2)]])("IVXLCDM"))(lambda arr, bol: ' '.join([(arr[1] if bol else "") + arr[0] * x for x in range(1,4)]) + " {}{} {}".format(arr[0], arr[1 + bol], arr[1 + bol])), (lambda a, b: list(map(int, (lambda f, a, b: f(f, a, b))((lambda f, a, b: [a[0]] + f(f, divmod(a[1], b), b / 10) if b >= 10 else list(a)), divmod(a, b) if n > 9 else [n], b / 10))))(n, (lambda m: 1 if m < 10 else 10 if m < 100 else 100 if m < 1000 else 1000)(n))))(n) if n > 0 else ''
在品葱你甚至可以学习js
闭包:闭关锁国的包子,简称闭包
闭包:闭关锁国的包子,简称闭包
我还以为是枪毙包子
这不是膜乎发的吗
我突然意识到,编程随想的博客之所以也有技术文章,原来是这个目的。
我还以为是新的乳包梗
我突然意识到,编程随想的博客之所以也有技术文章,原来是这个目的。
编程随想的“老本行”是程序员,因此叫“编程随想”,普及政治常识只是【副业】。
一开始他在博客写技术文章,后来由于朝廷计划在每个人的电脑上强行安装“绿坝”软件,他才开始写政治文章。
《是该写点技术以外的东西了》
(这篇文章写于开博之后不到半年)
这不是膜乎发的吗
膜乎那个是抄袭。
不如去编程随想的博客。
多引流来品葱也是好事,而且品葱的信息叫流量比那边高呢,
嗯,作为科技板块的提议者(自夸)很高兴能看到楼主发了这么多编程知识,建议admin封为品葱引流家。
我如果在现实中看见闭包我想的就是它原来的意思,但我在这里看见我就以为习近平又搞出什么新梗来了
多引流来品葱也是好事,而且品葱的信息叫流量比那边高呢,
编程随想的博客,文章都是干货,只是评论区的【信噪比】可能会因为五毛捣乱而降低。品葱的信噪比越来越差了 :(
想看怎么传指针,快写,加油