導航:首頁 > 源碼編譯 > 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閉包函數編譯原理相關的資料

熱點內容
釘釘加密有用嗎 瀏覽:112
加密u盤好還是不加密的 瀏覽:349
微觀經濟學平狄克第八版pdf 瀏覽:403
linux查看實時流量 瀏覽:557
如何存檔到伺服器 瀏覽:548
flash編程書籍推薦 瀏覽:835
php獲得數組鍵值 瀏覽:401
香港雲伺服器操作 瀏覽:303
wpe最新源碼 瀏覽:857
自己購買雲主伺服器推薦 瀏覽:422
個人所得稅java 瀏覽:761
多餘的伺服器滑道還有什麼用 瀏覽:192
pdf劈開合並 瀏覽:29
不能修改的pdf 瀏覽:752
同城公眾源碼 瀏覽:489
一個伺服器2個埠怎麼映射 瀏覽:298
java字元串ascii碼 瀏覽:79
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:946