1. 程式人生 > 其它 >十八、閉包

十八、閉包

閉包就是能夠讀取其他函式內部變數的函式

一、閉包簡介

閉包的作用:可以讀取函式內部的變數

函式的封裝

  • 在記憶體中,定義一個儲存空間,賦值一個記憶體地址,準備儲存函式

  • 將函式以類似字串的形式儲存在儲存空間中

  • 將儲存空間的記憶體地址,賦值給變數或者函式名稱儲存

 1 function fun2() {
 2   const obj = {
 3     name: '張三',
 4     age: 18,
 5   }
 6   // return 返回的實際是,obj變數中儲存的物件的記憶體地址
 7   return obj;
 8 }
 9 // 變數o中儲存的是obj物件的記憶體地址
10 const o = fun2();
  • 執行空間不被銷燬的條件

    • 函式的返回值是一個引用資料型別

    • 在函式外有另一個變數儲存返回值

  • 閉包的語法

    • 有一個函式A,返回值是一個函式B

    • 在函式A之外,有一個變數,儲存返回值函式B

    • 在函式B中呼叫函式A中希望在函式外被使用的變數

 1 function funA(){
 2   var int = 100;
 3 
 4   return function funB(){
 5     // return的是int中儲存的數值,不是int這個變數
 6     return int;
 7   }
 8 }
 9 const a = funA();
10 console.log( a ); // funB 11 // 此時,這個變數int,還無法在函式外被呼叫 12 console.log( int ) 13 // 呼叫a執行 14 console.log( a() ); // 100

二、閉包的特點

  • 函式的執行空間不會被銷燬

    • 優點:空間中的內容,會一直存在

    • 缺點:會佔用記憶體空間,降低執行效率

  • 可以從函式外部呼叫函式內部的資料

    • 優點:資料使用便捷

    • 缺點:容易造成資料洩露,不安全

  • 保護區域性作用域變數不被銷燬

    • 優點:區域性作用域變數不被銷燬

    • 缺點:佔用儲存空間,容易記憶體洩露

記憶體洩漏:是指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果

  • 全域性變數汙染:

    • 如果一個全域性作用域變數,被不應該操作的函式,修改了儲存的資料,就稱為全域性變數濡染

    • 全域性作用域變數特點:任意一個函式都可以呼叫修改這個變數儲存的資料數值

    • 閉包看似是一個為了呼叫函式內,區域性作用域變數的方法

    • 實際上,是為了防止全域性變數汙染的一個手段

    • 為了防止全域性變數汙染,可以使用一個函式,將變數定義為區域性作用域變數

    • 其他函式的操作,就不會影響到這個變數儲存的資料了

    • 使用閉包讓區域性作用域變數可以在函式外部被呼叫、被使用