什麼是閉包?閉包的作用是什麼?
閉包的定義
《JavaScript高階程式設計》:
閉包是指有權訪問另一個函式作用域中的變數的函式
《JavaScript權威指南》:
從技術的角度講,所有的JavaScript函式都是閉包:它們都是物件,它們都關聯到作用域鏈。
《你不知道的JavaScript》
當函式可以記住並訪問所在的詞法作用域時,就產生了閉包,即使函式是在當前詞法作用域之外執行。
自己的解釋:一個內部函式,有權訪問包含其的外部函式中的變數,就形成了閉包。
建立一個閉包
function foo() {
var a = 2;
return function fn() {
console.log(a);
}
}
let func = foo();
func(); //輸出2
閉包使得函式可以繼續訪問定義時的詞法作用域。拜 fn 所賜,在 foo() 執行後,foo 內部作用域不會被銷燬。
閉包的作用
1. 能夠訪問函式定義時所在的詞法作用域(阻止其被回收)。
2. 私有化變數
function base() {
let x = 10; //私有變數
return {
getX: function() {
return x;
}
}
}
let obj = base();
console.log(obj.getX()); //10
3. 模擬塊級作用域
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = (function(j){
return function () {
console.log(j);
}
})(i);
}
a[6](); // 6
4. 建立模組
function coolModule() {
let name = 'Yvette';
let age = 20;
function sayName() {
console.log(name);
}
function sayAge() {
console.log(age);
}
return {
sayName,
sayAge
}
}
let info = coolModule();
info.sayName(); //'Yvette'
模組模式具有兩個必備的條件
- 必須有外部的封閉函式,該函式必須至少被呼叫一次(每次呼叫都會建立一個新的模組例項)
- 封閉函式必須返回至少一個內部函式,這樣內部函式才能在私有作用域中形成閉包,並且可以訪問或者修改私有的狀態。
閉包的缺陷
-
常駐記憶體會增大記憶體使用量,使用不當很容易造成記憶體洩露。
-
如果不是因為某些特殊任務而需要閉包,在沒有必要的情況下,在其它函式中建立函式是不明智的,因為閉包對指令碼效能具有負面影響,包括處理速度和記憶體消耗。
相關文章
- 閉包是什麼?怎麼形成一個閉包?為什麼使用閉包?
- Python中什麼是閉包?閉包的好處是什麼?Python
- 什麼是閉包
- 閉包是什麼?
- 什麼是閉包?
- 什麼是閉包,閉包的優缺點?
- 什麼是閉包陷阱?
- [JS]什麼是閉包?JS
- javascript中閉包是什麼JavaScript
- 什麼是閉包?舉個例子
- javaScript面試題整理 --- 什麼是閉包,什麼是立即執行函式,它的作用是什麼?簡單說一下閉包的使用場景JavaScript面試題函式
- 什麼是過時閉包及如何解決過時閉包的坑
- 什麼是閉包?有哪些使用場景?優缺點是什麼?
- 為什麼js會有閉包JS
- [Python小記] 通俗的理解閉包 閉包能幫我們做什麼?Python
- 面試官問我:什麼是JavaScript閉包,我該如何回答面試JavaScript
- 什麼是@Component,@Component的作用是什麼
- 什麼是去中心化錢包?去中心化錢包是什麼意思?中心化
- 閉包,是真的美
- java開閉原則是什麼?Java
- 什麼是seLinux?Linux關閉seLinux有什麼影響?Linux
- 閉包
- 什麼是CDN?CDN的原理和作用是什麼?
- Swift-逃逸閉包、自動閉包Swift
- 閉包 | 淺談JavaScript閉包問題JavaScript
- 什麼是熱插拔?其功能作用是什麼?
- Linux中gpgcheck是什麼意思?作用是什麼?LinuxGC
- 閉包的起源
- JavaScript 的閉包JavaScript
- 什麼是去中心化錢包?中心化
- 什麼是區塊鏈錢包區塊鏈
- js閉包及閉包的經典使用場景JS
- [JavaScript閉包]Javascript閉包的判別,作用和示例JavaScript
- 【集合論】關係閉包 ( 關係閉包求法 | 關係圖求閉包 | 關係矩陣求閉包 | 閉包運算與關係性質 | 閉包複合運算 )矩陣
- 前端面試中讓你困惑的閉包、原型、原型鏈究竟是什麼?前端面試原型
- JavaScript - 閉包JavaScript
- JavaScript 閉包JavaScript
- Golang閉包Golang