导航:首页 > 源码编译 > closure闭包函数编译原理

closure闭包函数编译原理

发布时间:2022-10-17 08:14:22

A. 什么是ε-closure

闭包(Closure)是函数(或方法)及其执行环境的组合体,它不仅包括函数(或方法)本身,也包括函数(或方法)运行时的上下文词汇环境。闭包是所有动态语言的基石,闭包实现了函数(或方法)可以作为参数传递给函数(或方法)。
ε-closure是闭包函数,表示是当前状态通过ε边可以到达的所有状态的集合
集合的ε-closure
就是集合中所有状态的ε-closure的并集
ε是一个变量。

B. python什么是闭包 闭包的作用域

简单说,闭包就是根据不同的配置信息得到不同的结果

再来看看专业的解释:闭包(Closure)是词法闭包(Lexical
Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法
认为闭包是由函数和与其相关的引用环境组合而成的实体。

python实例

看概念总是让人摸不着头脑,看几个python小例子就会了

def make_adder(addend):
def adder(augend):
return augend + addend
return adder

p = make_adder(23)
q = make_adder(44)

print p(100)
print q(100)

运行结果:
123
144

分析一下:

我们发现,make_adder是一个函数,包括一个参数addend,比较特殊的地方是这个函数里面又定义了一个新函数,这个新函数里面的一个变量正好是外部make_adder的参数.也就是说,外部传递过来的addend参数已经和adder函数绑定到一起了,形成了一个新函数,我们可以把addend看做新函数的一个配置信息,配置信息不同,函数的功能就不一样了,也就是能得到定制之后的函数.

再看看运行结果,我们发现,虽然p和q都是make_adder生成的,但是因为配置参数不同,后面再执行相同参数的函数后得到了不同的结果.这就是闭包.

C. 如何理解javascript closure

定义:闭包(closure)就是能够读取其他函数内部变量的函数。

javascript语言的特点,由于变量的作用域在函数内部,导致函数外部无法读取函数内部的变量。

看下面这段代码,如果要从外部读取函数内部的变量,会出错。

functionf1(){
varn=999;
}
alert(n);//error

如果想要读取函数内部的变量怎么办呢?所以就需要闭包,就是一个可以读取其他函数内部变量的函数。

functionf1(){
varn=999;
functionf2(){
alert(n);
}
returnf2;
}
varresult=f1();
result();//999

把f2作为返回值,就可以在f1外部读取它的内部变量。

函数f2就是闭包

D. 什么是闭包,为什么要用它

一、变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
二、如何从外部读取局部变量?
出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。
那就是在函数的内部,再定义一个函数。
三、闭包的概念
上一节代码中的f2函数,就是闭包。
各种专业文献上的“闭包”(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
--------------------------------------------------------------------------------------------------------b
四、闭包的用途
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

E. 闭包的实质是什么

闭包(closure)是计算机编程领域的专业名词,指可以包含自由(未绑定到特定对象)变量的代码块,子函数可以使用父函数中的局部变量。闭包源于要执行的代码块和为自由变量提供绑定的计算环境(作用域)两者的结合,Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python、Lua、objective c 以及Java(Java8及以上)等语言中都能找到对闭包不同程度的支持。

本质
集合 S 是闭集当且仅当 Cl(S)=S(这里的cl即closure,闭包)。特别的,空集的闭包是空集,X 的闭包是 X。集合的交集的闭包总是集合的闭包的交集的子集(不一定是真子集)。有限多个集合的并集的闭包和这些集合的闭包的并集相等;零个集合的并集为空集,所以这个命题包含了前面的空集的闭包的特殊情况。无限多个集合的并集的闭包不一定等于这些集合的闭包的并集,但前者一定是后者的父集。

若 A 为包含 S 的 X 的子空间,则 S 在 A 中计算得到的闭包等于 A 和 S 在 X 中计算得到的闭包(Cl_A(S) = A ∩ Cl_X(S))的交集。特别的,S在 A 中是稠密的,当且仅当 A 是 Cl_X(S) 的子集。

度量空间中的闭包
对欧几里德空间的子集 S,x 是 S 的闭包点,若所有以 x 为中心的开球都包含 S 的点(这个点也可以是 x)。

这个定义可以推广到度量空间 X 的任意子集 S。具体地说,对具有度量 d 的度量空间 X,x 是 S 的闭包点,若对所有 r>0,存在 y 属于 S,使得距离 d(x,y)<r(同样的,可以是 x = y)。另一种说法可以是,x 是 S 的闭包点,若距离 d(x,S) := inf{d(x,s) : s 属于 S} = 0(这里 inf 表示下确界)。

这个定义也可以推广到拓扑空间,只需要用邻域替代“开球”。设 S 是拓扑空间 X 的子集,则 x 是 S 的闭包点,若所有 x 邻域都包含 S 的点。注意,这个定义并不要求邻域是开的。

F. 编译原理中,LR(0)文法的项目集规范族的I0,I1,I2,I3…………是怎么求的~

先举个例子:

}

将其命名为I1。

其他可类似推出。

G. 编译原理中的闭包是什么意思,在数据库中看到过闭包

闭包就是由一个属性直接或间接推导出的所有属性的集合,例如:
f={a->b,b->c,a->d,e->f}
由a可直接得到b和d,间接得到c,则a的闭包就是{a,b,c,d}

H. 关于闭包的理解问题,小白求大牛解答!!

首先应该深入的理解一下闭包的概念,维基网络上关于闭包的解释理解起来比较容易些,我把前面两段话简单的处理一下:

在程序语言中,闭包(Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。闭包是由函数和与其相关的引用环境组合而成的实体。

在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。运行时,一旦外部的函数被执行,一个闭包就形成了,闭包中包含了内部函数的代码,以及所需外部函数中的变量的引用。

理解了闭包之后,再来看你的第一个问题,虽然A处的inc函数只是声明,但是闭包在外层函数a执行的时候就已经生成,形成的闭包包括了内部函数的代码和所需外部变量的引用。根据定义,还有一点需要注意,即形成的闭包保存的是外部变量的引用,看下面的例子:

		vararr=[];
for(vari=0;i<3;i++){
arr[i]=returnfunction(){
alert(i)
}
}
arr[0]();
arr[1]();
arr[2]();

每次都是弹出3,即闭包只记住外部变量存放在了哪里,在内部函数还没有执行前,它是不管你的值是什么的,任你怎么变,我执行的时候只获取最后的值。要想实现想要的效果,可以这样做:

		vararr=[];
for(vari=0;i<3;i++){
arr[i]=function(j){
returnfunction(){
alert(j)
}
}(i)
}
arr[0]();
arr[1]();
arr[2]();

这里用一个立即执行函数,使得每次循环的i值都记录下来了。

你的第二个问题看了好几遍还是不太理解你想问什么,简单的说一些常识吧。function a(...)和var a=function(...)是函数的两种声明方式,无论哪一种,只要你没有重新给a赋值,即a还指向这个函数,那么这个函数所占据的内存就不会被回收,函数执行完毕后回收的只是函数内部声明的局部变量(如果变量没有被内部函数引用形成闭包),故而函数的局部变量在函数每次执行时都重新定义,重新赋值。


I. 闭包的实质是什么

闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
集合 S 是闭集当且仅当 Cl(S)=S(这里的cl即closure,闭包)。特别的,空集的闭包是空集,X 的闭包是 X。集合的交集的闭包总是集合的闭包的交集的子集(不一定是真子集)。有限多个集合的并集的闭包和这些集合的闭包的并集相等;零个集合的并集为空集,所以这个命题包含了前面的空集的闭包的特殊情况。无限多个集合的并集的闭包不一定等于这些集合的闭包的并集,但前者一定是后者的父集。
若 A 为包含 S 的 X 的子空间,则 S 在 A 中计算得到的闭包等于 A 和 S 在 X 中计算得到的闭包(Cl_A(S) = A ∩ Cl_X(S))的交集。特别的,S在 A 中是稠密的,当且仅当 A 是 Cl_X(S) 的子集。

J. 编译原理项目集规范族问题GO(I,X)中的X是安什么顺序进行测试的

这个问题本身不太准确。

GO(I,X)是一个转换函数,它的定义如下:

GO(I,X)中的X是一个文法符号,可以是终结符或非终结符,CLOSURE(J)是J的闭包函数,闭包函数的定义就不多说了。

问题“GO(I,X)中的X是按什么顺序进行测试”,是否可解释成“X是按出现在产生式中的顺序进行测试”

阅读全文

与closure闭包函数编译原理相关的资料

热点内容
录像免压缩 浏览:502
总结所学过的简便算法 浏览:358
南昌哪些地方需要程序员 浏览:758
三台服务器配置IP地址 浏览:173
如何用命令方块连续对话 浏览:278
win7linux共享文件夹 浏览:304
命令符打开本地服务 浏览:599
android应用程序源码 浏览:702
安卓开发工程师简历怎么写 浏览:60
热水器水量服务器是什么意思 浏览:117
stk卫星编译 浏览:480
对后台程序员的要求 浏览:761
ios大文件夹图标 浏览:626
生的计划pdf 浏览:714
oppoa93加密便签在哪查找 浏览:21
两个数字的加减乘除运算编程 浏览:227
给手机加密码忘记了怎么办 浏览:601
单片机运算符 浏览:297
移动端微信商城源码 浏览:446
编程猫下一个背景在哪里 浏览:359