想要好好的理解閉包,你得首先理解作用域,別說了,趕緊去看作用域吧,?,這世界就是如此殘酷,好,言歸正傳,我們是來學習閉包的,O(∩_∩)O
簡單點 這就是閉包
// 閉包;函式前天函式;內部函式就是閉包
function outerfn() {
function interfn() { } //這就是閉包函式
}
菜來了!?
閉包只要記住:
- 閉包產生是:函式內嵌套函式;
- 閉包函式在外面被呼叫,訪問;
- 閉包可以訪問外部的變數,但是外部的變數不能訪問內部;
- 閉包可以保持對定義時的作用域的參考,使之不被銷毀,長生不老,
// 閉包函式能不能用外部定義的變數?
// 涉及到作用域鏈 函式內部使用變數,如果函式內部有就使用,沒有就回去上一層去找,一直找到全域環境下
//簡單理解就是一層一層套下來,使用變數的時候一層一層往外找
function outerfn() {
let a = 10
function interfn() {
console.log(a);
}
// 如果使用outerfn需要把閉包return出去,當時用outerfn得時候其實是把interfn賦值給了outerfn
return interfn
}
let fn = outerfn()
fn()

輸出的肯定是10
那么就有的同學問了 為什么是10呢?
麻煩你看一下上面好嗎?

正常情況下 函式執行完成,內部變數會被銷毀,那么有的同學就問了 為啥要銷毀呢 ? 你是十萬個為什么嗎? 問就是 釋放記憶體空間
在函式外面是不能呼叫函式內部的a, 當執行這個函式的時候可以呼叫的,函式執行完就被釋放了 沒了懂嗎 a沒了
閉包函式為什么不會銷毀:內部函式沒有執行完成,當呼叫外部函式時,內部函式return 給了外部函式,還能被呼叫,能被呼叫,外部變數不會被銷毀 ,也是閉包的一個特性
閉包的應用
閉包可以干什么呢 ? 可以封裝一段代碼 實作模塊化
先看下面這段代碼
let a = 10
let b = 20
function add() {
return a + b
}
function acc() {
return a - b
}
let result1 = add()
let result2 = acc()
console.log(result1);
console.log(result2);
有什么問題呢?
我們定義了 兩個全域變數和全域函式 這么多代碼看著一點都不爽
封裝之后
let yy = (function () {
let a = 10
let b = 20
function add() {
return a + b
}
function acc() {
return a - b
}
//return出去 yy就有了這兩個方法了
return{
add,
acc
}
})()
let result1 = yy.add()
let result2 = yy.acc()
console.log(result1);
console.log(result2);
封裝起來 呼叫時 我只用了yy這一個變數實作了 兩個功能
簡單方便
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/317959.html
標籤:其他
上一篇:手寫JavaScript陣列api(徹底弄懂陣列api!)
下一篇:HTML5期末大作業:在線電影介紹(6頁) HTML+CSS+JavaScript 大學生畢設網頁設計原始碼HTML web網頁設計制作成品
