下面我們就簡單的了解一下閉包這個東西到底是什麼
首先,我們先來講講什麼是閉包
簡單來說就是乙個定義在函式內部的函式,可以讀取到其他函式內部變數的函式,本質上,閉包就是乙個把函式內部和外部連線起來的橋梁
那我們讀取函式內部的變數為什麼要用到閉包呢,或者說閉包的作用是什麼?
這就涉及到變數的生命週期問題了,函式內部定義的變數屬於區域性變數,區域性變數的生命週期是:當它所在的函式被呼叫的時候,就是開始,當呼叫執行一旦結束,區域性變數就會被釋放,當我們需要函式內部變數時,他已經被釋放了,讀取不到了,這個時候怎麼解決?我們就要想辦法延長他的生命週期
閉包的目的也可以說就是這個,延長區域性變數的生命週期,當函式執行完畢以後,區域性變數不可以被記憶體釋放,然後讓外部可以訪問到這個變數
那我們如何判斷閉包是不是存在呢
閉包主要有以下幾個特點:
1、函式套函式,閉包一定有巢狀函式
這個意思從閉包的字面定義上其實就可以大概推出來,定義在函式內部的函式;
那為什麼一定要函式套函式呢?因為需要區域性變數,閉包的目的就是訪問函式內部的區域性變數,如果不定義區域性變數,那就達不到我們的目的——延長變數生命週期
2、外層函式一定有區域性變數,且內層函式一定操作了外層函式的這個變數
3、外層函式一定把內層函式返回外部,使用return
為什麼要用return返回這個內層函式呢?因為如果不返回這個內層函式,你就沒辦法使用這個閉包,返回內層函式的最終的目的就是讓外部可以訪問到這個閉包,如果外部沒辦法訪問閉包,那閉包怎麼做函式內部和外部溝通的橋梁
在做閉包的問題時,我們還需要注意以下兩點:
1、外層函式被多次呼叫,都會建立新的作用域,也就是說內層函式操作的外層函式的區域性變數之間是不會影響的
這句話簡單來說就是我第一次呼叫這個外層函式,使用了內部的區域性變數 p;我第二次第三次再呼叫這個外層函式使用變數 p的時候,會建立新的作用域,並不會對之前的呼叫產生什麼影響
2、外層函式返回的內層函式被呼叫幾次,內層函式操作的外層函式的區域性變數就會變化幾次
上面兩點都可以通過下面這段**看出來
下面是具體的輸出結果
對前面解釋不明白的可以結合**和輸出結果來分析,
第一點:每次的外層函式呼叫輸出結果都是互不影響的,看每次呼叫的第乙個輸出結果都為0(這裡呼叫的是外層函式);
第二點,在我【one第一次呼叫】【two第二次呼叫】【three第三次呼叫】的幾次輸出結果中可以看出,我每輸出一次(內層函式被呼叫一次),變數的值就會發生變化,自增1,我輸出幾次也就是呼叫了幾次,變數他就變化了幾次
請注意上面雖然都是說呼叫,但是呼叫的函式是不同的,呼叫的是外層函式,變數互不影響,呼叫的是內層函式,那麼變數變化會根據你呼叫的次數變化
這裡我也不知道大家能不能明白我到底想表達個啥
閉包的壞處
閉包使函式內部的變數不能被記憶體釋放,這些變數就會占用記憶體,記憶體消耗大,可能會導致記憶體洩露
什麼是閉包及閉包的優缺點
1 什麼是作用域鏈?在理解閉包以前.最好能先理解一下作用域鏈的含義,簡單來說,作用域鏈 就是函式在定義的時候建立的,用於尋找使用到的變數的值的乙個索引,而他內部的規則是,把函式自身的本地變數放在最前面,把自身的父級函式中的變數放在其次,把再高一級函式中的變數放在更後面,以此類推直至全域性物件為止.當...
JS閉包的理解及其優缺點
初級理解 js高程 小紅書 閉包是指有權訪問另乙個函式作用域中變數的函式。其認為閉包是乙個函式 中級理解 you don t know js 小黃書 閉包是導致函式呼叫棧不能正常銷毀的一種持續引用 這種引用一般體現於某個函式體內其他函式的宣告 高階理解 形成閉包的真正原因是 作用域未能正常釋放,變數...
閉包的使用方式及其優缺點
閉包是指可以包含自由 未繫結到特定物件 變數的 塊 這些變數不是在這個 塊內或者任何全域性上下文中定義的,而是在定義 塊的環境中定義 區域性變數 一.閉包的定義和呼叫階段 定義 開闢乙個函式空間,把 存放在函式的儲存空間內,把空間位址複製給函式名 呼叫 1.按照函式名儲存的位址找到儲存空間 2.再次...