Lua基礎系列 之閉包

2021-10-03 07:08:49 字數 1482 閱讀 3417

歡迎來到lua基礎系列的部落格

前文再續,書接上一回。

今天要接著講lua中的閉包。在講閉包之前,我們首先了解一下第一類值和詞法定界這兩個概念

對於函式來說,第一類值指的是函式本身可以作為值賦值給變數,函式本身也可以作為引數傳遞給另外的函式。

對於後者來說我們還比較容易理解,畢竟我們在各種高階語言裡面也接觸過,也就是把函式指標作為引數傳遞。

但是對於前者來說我們就不得不感嘆lua的強大。

(1)函式本身可以作為值賦值給變數

function foo(x) 

return x;

end--和以下例子等價

foo = function (x)

return x;

end

因為lua裡面所有的函式都是匿名的,所以沒有函式名這一說法,只不過是把函式存放在「函式名」這個變數中而已(2)函式可以作為引數傳遞給其他函式最常見的就是我們的表排序函式了,我們為了能夠按照想要的需求排列順序,我們可以執行以下操作:

此時我們的函式就能作為引數傳遞給另乙個函式,綜上就是第一類值的定義

詞法定界是當你編寫乙個其他函式b包含函式a時,被包含的函式a可以呼叫函式b中所有區域性變數。

這也是閉包的概念所在。

what?這就是閉包??這不是很正常的嗎,我在各種高階語言裡面不久一直是內部函式可以訪問外部函式的值嗎??

沒錯,閉包這麼高大上的詞其實就是描述這個定義,所以再被面試官問到的時候可別被唬住了。

舉個例子:

-- 例子一

function newcounter()

local count = 0

return function count()

count = count + 1

return count

endend

此時的count是外部函式newcounter的區域性變數,但是我們的內部函式count仍然可以訪問到它。這就是閉包的特性。

Lua基礎系列 閉包

歡迎來到lua高階系列的部落格 簡單來說就是 對於乙個函式,能夠訪問到外部函式的非全域性變數的一種機制。說起來很繞,我們看乙個栗子 function func1 local x 1 定義乙個內部函式 function func2 print x end 執行這個內部函式 這個例子就是在外部呼叫了fu...

javascript之閉包基礎

閉包基礎 function f1 return f2 閉包 能夠訪問乙個函式內部變數的函式 f2就是乙個閉包 var f f1 呼叫f1之後返回閉包函式 f 1 f 2 原因 閉包函式引用了外部函式的變數,導致外部函式變數不會立即被 閉包延長了函式內部變數的生命週期 注意 函式的引數也是區域性變數,...

lua閉包全面解析

在 lua中,閉包 closure 是由乙個函式和該函式會訪問到的非區域性變數 或者是 upvalue 組成的,其中非區域性變數 non local variable 是指不是在區域性作用範圍內定義的乙個變數,但同時又不是乙個全域性變數,主要應用在巢狀函式和匿名函式裡,因此若乙個閉包沒有會訪問的非區...