閉包是指可以包含自由(未繫結到特定物件)變數的**塊;這些變數不是在這個**塊內或者任何全域性上下文中定義的,而是在定義**塊的環境中定義(區域性變數)。
一.閉包的定義和呼叫階段
定義:開闢乙個函式空間,把**存放在函式的儲存空間內,把空間位址複製給函式名
呼叫:1.按照函式名儲存的位址找到儲存空間;
2.再次開闢乙個函式執行空間;
3.在執行空間內部進行引數賦值;
4.在執行空間進行預解析;
5.把儲存空間的**複製乙份到執行空間執行;
6.**執行完畢以後,執行空間銷毀
二.乙個不會銷毀的函式空間(閉包空間)
當函式裡面返回乙個複雜函式資料型別,並且在函式外部有變數引入這個被返回的複雜資料型別的時候,這個函式執行空間不會被銷毀就這樣形成了閉包空間。
三.閉包的條件
1.函式a內部直接或間接返回乙個函式b;
2.函式b內部使用著函式a的私有資料;
3.函式a外部有變數引用著函式b
舉個小例子:
四.閉包的優缺點
1.延長變數的宣告週期
=>優點:變數會一直存在
=>缺點:乙個不會銷毀的函式執行空間
2.可以在函式外部使用著函式a的私有變數
=>優點:函式外部訪問內部資料
=>缺點:有乙個不會銷毀的函式執行空間
3.保護私有變數
=>優點:內部變數不能在外部訪問
=>缺點:閉包空間記憶體溢位
總結: 閉包說白了就是乙個環境,能夠讀取其他函式內部的變數。
本質上,閉包是將函式內部和函式外部連線起來的橋梁。雖然缺點也有,但是利大於弊。
JS閉包的理解及其優缺點
初級理解 js高程 小紅書 閉包是指有權訪問另乙個函式作用域中變數的函式。其認為閉包是乙個函式 中級理解 you don t know js 小黃書 閉包是導致函式呼叫棧不能正常銷毀的一種持續引用 這種引用一般體現於某個函式體內其他函式的宣告 高階理解 形成閉包的真正原因是 作用域未能正常釋放,變數...
什麼是閉包及閉包的優缺點
1 什麼是作用域鏈?在理解閉包以前.最好能先理解一下作用域鏈的含義,簡單來說,作用域鏈 就是函式在定義的時候建立的,用於尋找使用到的變數的值的乙個索引,而他內部的規則是,把函式自身的本地變數放在最前面,把自身的父級函式中的變數放在其次,把再高一級函式中的變數放在更後面,以此類推直至全域性物件為止.當...
閉包的作用及優缺點
下面我們就簡單的了解一下閉包這個東西到底是什麼 首先,我們先來講講什麼是閉包 簡單來說就是乙個定義在函式內部的函式,可以讀取到其他函式內部變數的函式,本質上,閉包就是乙個把函式內部和外部連線起來的橋梁 那我們讀取函式內部的變數為什麼要用到閉包呢,或者說閉包的作用是什麼?這就涉及到變數的生命週期問題了...