閉包是什麼?
一、閉包的概念
百度百科:閉包是可以讀取其他函式內部變數的函式。例如在javascript中,只有函式內部的子函式才能讀取區域性變數,所以閉包可以理解為定義在一個函式內部的函式。在本質上,閉包是將函式外部和函式內部聯絡起來的橋樑。
在javascript第三版程式設計中是這樣定義的:閉包是有權訪問另一個函式作用域中變數的函式。
我們先看看一個簡單的例子
function test(){
var n = 1;
return function(){
console.log(n);
}
}
var result = test();
result(); //1
上面是一個簡單的閉包例子。
提問:
(1)result執行完之後,為何n變數沒有釋放???
二、閉包的應用
1.ul列表中點選每一項
html
<ul>
<li>0</li>
<li>1</li>
<li>2</li>
</ul>
var oList = document.getElementsByTagName('li');
for (var i = 0; i < oList.length; i++) {
oList[i].onclick = function () {
console.log(i);
}
}
不論點選哪一個li,輸出的結果都是3。因為在點選li時,for迴圈已經遍歷完。
解決方法很多:
(1)可以記錄索引值
for (var i = 0; i < oList.length; i++) {
oList[i].index = i;
oList[i].onclick = function () {
var index = this.index;
console.log(index);
}
}
(2)用let
for (let i = 0; i < oList.length; i++) {
oList[i].onclick = function () {
console.log(i);
}
}
(3)用閉包
第一種:
function makeHelpCallback(i){
return function(){
console.log(i);
}
}
for(var i=0;i<oList.length;i++){
oList[i].onclick = makeHelpCallback(i);
}
第二種:
for (var i = 0; i < oList.length; i++) {
(function (index) { //index相當於形參
oList[index].onclick = function () {
console.log(index);
}
})(i) //i相當於實參
}
2.用閉包來模擬私有方法
//模組模式
var Counter = (function(){
var privateCounter = 0;
function changeBy(val) {
privateCounter +=val;
}
return {
increment: function(){
changeBy(1);
},
decrement: function(){
changeBy(-1);
},
value: function(){
return privateCounter;
}
}
})()
console.log(Counter.value());
Counter.increment();
Counter.increment();
console.log(Counter.value());
Counter.decrement();
console.log(Counter.value());
相關文章
- 什麼是閉包?閉包的作用是什麼?
- 什麼是閉包
- 什麼是閉包?
- Python中什麼是閉包?閉包的好處是什麼?Python
- 閉包是什麼?怎麼形成一個閉包?為什麼使用閉包?
- 什麼是閉包陷阱?
- [JS]什麼是閉包?JS
- 什麼是閉包,閉包的優缺點?
- javascript中閉包是什麼JavaScript
- 什麼是閉包?舉個例子
- 什麼是閉包?有哪些使用場景?優缺點是什麼?
- 什麼是過時閉包及如何解決過時閉包的坑
- javaScript面試題整理 --- 什麼是閉包,什麼是立即執行函式,它的作用是什麼?簡單說一下閉包的使用場景JavaScript面試題函式
- 為什麼js會有閉包JS
- 面試官問我:什麼是JavaScript閉包,我該如何回答面試JavaScript
- [Python小記] 通俗的理解閉包 閉包能幫我們做什麼?Python
- 什麼是去中心化錢包?去中心化錢包是什麼意思?中心化
- 閉包,是真的美
- java開閉原則是什麼?Java
- 什麼是seLinux?Linux關閉seLinux有什麼影響?Linux
- 什麼是去中心化錢包?中心化
- 什麼是區塊鏈錢包區塊鏈
- 什麼是區塊鏈錢包開發區塊鏈
- 什麼是NFT數字錢包開發?
- python無法匯入包是什麼原因Python
- imtoken錢包是什麼?imtoken錢包教程
- 包裝類到底是幹什麼的
- 我就想學介面測試,為什麼還要學 Fiddler 抓包,抓包是什麼鬼?
- linux關閉防火牆命令是什麼 linux永久關閉防火牆命令分享Linux防火牆
- 閉包
- 伺服器ping丟包是因為什麼?伺服器
- iCloud是什麼?怎麼關閉“icloud儲存空間不足”提醒?Cloud
- Swift-逃逸閉包、自動閉包Swift
- 閉包 | 淺談JavaScript閉包問題JavaScript
- 【集合論】關係閉包 ( 關係閉包求法 | 關係圖求閉包 | 關係矩陣求閉包 | 閉包運算與關係性質 | 閉包複合運算 )矩陣
- Netty(三) 什麼是 TCP 拆、粘包?如何解決?NettyTCP
- 什麼是DNS,什麼是HostsDNS
- 這是什麼這是什麼