閉包的作用及優缺點

2022-06-23 21:03:12 字數 1617 閱讀 2581

下面我們就簡單的瞭解一下閉包這個東西到底是什麼

首先,我們先來講講什麼是閉包

簡單來說就是一個定義在函式內部的函式,可以讀取到其他函式內部變數的函式,本質上,閉包就是一個把函式內部和外部連線起來的橋樑

那我們讀取函式內部的變數為什麼要用到閉包呢,或者說閉包的作用是什麼?

這就涉及到變數的生命週期問題了,函式內部定義的變數屬於區域性變數,區域性變數的生命週期是:當它所在的函式被呼叫的時候,就是開始,當呼叫執行一旦結束,區域性變數就會被釋放,當我們需要函式內部變數時,他已經被釋放了,讀取不到了,這個時候怎麼解決?我們就要想辦法延長他的生命週期

閉包的目的也可以說就是這個,延長區域性變數的生命週期,當函式執行完畢以後,區域性變數不可以被記憶體釋放,然後讓外部可以訪問到這個變數

那我們如何判斷閉包是不是存在呢

閉包主要有以下幾個特點:

1、函式套函式,閉包一定有巢狀函式

這個意思從閉包的字面定義上其實就可以大概推出來,定義在函式內部的函式;

那為什麼一定要函式套函式呢?因為需要區域性變數,閉包的目的就是訪問函式內部的區域性變數,如果不定義區域性變數,那就達不到我們的目的——延長變數生命週期

2、外層函式一定有區域性變數,且內層函式一定操作了外層函式的這個變數

3、外層函式一定把內層函式返回外部,使用return

為什麼要用return返回這個內層函式呢?因為如果不返回這個內層函式,你就沒辦法使用這個閉包,返回內層函式的最終的目的就是讓外部可以訪問到這個閉包,如果外部沒辦法訪問閉包,那閉包怎麼做函式內部和外部溝通的橋樑

在做閉包的問題時,我們還需要注意以下兩點:

1、外層函式被多次呼叫,都會建立新的作用域,也就是說內層函式操作的外層函式的區域性變數之間是不會影響的

這句話簡單來說就是我第一次呼叫這個外層函式,使用了內部的區域性變數 p;我第二次第三次再呼叫這個外層函式使用變數 p的時候,會建立新的作用域,並不會對之前的呼叫產生什麼影響

2、外層函式返回的內層函式被呼叫幾次,內層函式操作的外層函式的區域性變數就會變化幾次

上面兩點都可以通過下面這段**看出來

下面是具體的輸出結果

對前面解釋不明白的可以結合**和輸出結果來分析,

第一點:每次的外層函式呼叫輸出結果都是互不影響的,看每次呼叫的第一個輸出結果都為0(這裡呼叫的是外層函式);

第二點,在我【one第一次呼叫】【two第二次呼叫】【three第三次呼叫】的幾次輸出結果中可以看出,我每輸出一次(內層函式被呼叫一次),變數的值就會發生變化,自增1,我輸出幾次也就是呼叫了幾次,變數他就變化了幾次

請注意上面雖然都是說呼叫,但是呼叫的函式是不同的,呼叫的是外層函式,變數互不影響,呼叫的是內層函式,那麼變數變化會根據你呼叫的次數變化

這裡我也不知道大家能不能明白我到底想表達個啥

閉包的壞處

閉包使函式內部的變數不能被記憶體釋放,這些變數就會佔用記憶體,記憶體消耗大,可能會導致記憶體洩露

執行環境 作用域鏈及閉包

執行環境 execution context 定義了變數或函式有權訪問的其他資料,決定了他們各自的行為。每個執行環境都有一個與之關聯的變數物...

tomcat 的意義及作用

context path 是在tomcat 要支援多個應用時對每個應用的docbase做區別時的區分符。 打個比方假如你有兩個請求 一個為 http localhost 8080 test1 helloworld 另外一個為 http localhost 8080 test2 helloworld ...

vue中template的作用及使用

需求 下圖div用v for做了列表迴圈,現在想要span也一起迴圈,應該怎麼做? 有3種方法可以實現 直接用v for對span也迴圈一次 該方法雖然可以使用,但不要用這種方式,因為以後你會哭 在div和span外面包裹一個div,給這個div加迴圈 該方法會額外增加一個多餘的div標籤 temp...