閉包形成原理及應用

2021-09-25 23:56:36 字數 2827 閱讀 8860

函式的ao通過scope chain相互連線起來使得函式體內的變數都可以儲存在函式的ao,這樣的特性稱為「閉包」。

只要你把乙個函式裡面的函式,作為 return 的方式返回到外邊,扔給乙個變數。只要做這個事剛才的呼叫就產生了閉包。

閉包會造成原有ao不釋放,產生記憶體洩漏,或者說是記憶體不合理占用。

因為outer activation object 一直不能釋放,就形成了乙個閉包

1,實現公有變數

//累加器

function

add(

)return

addaction()

;}var myadd =

add();

myadd()

;myadd()

;myadd()

;myadd([

1]);

myadd()

;

2, 快取儲存結構

function

add(

)function

clearaction()

return

[addaction,clearaction];}

var myadd =

add();

myadd[0]

(); myadd[0]

(); myadd[0]

(); myadd[0]

(); myadd[1]

(); myadd[0]

(); myadd[0]();

3, 封裝,實現屬性私有化//鼓勵使用方法,不鼓勵直接操作變數

function

counter()

, clearaction:

function()

};return adder;

}var mycounter =

counter()

; mycounter.

addaction()

; mycounter.

addaction()

; mycounter.

addaction()

; mycounter.

addaction()

; mycounter.

clearaction()

; mycounter.

addaction()

; mycounter.

addaction()

; mycounter.

addaction()

; mycounter.

addaction()

;

4,模組化開發,防止汙染全域性變數如果我們從別人的地方copy過來的**的變數和自己的變數重複,兩段**分開都執行正常,但是放到一起可能就會出錯,所以用閉包的方法把他們封裝在乙個函式裡面返回出來,就可以避免這種情況發生。

在大型公司模組化開發,全部使用閉包,不允許使用公有變數

function

outer()

return add;

}var fn=

outer()

;fn()

;// 101fn(

);//102fn(

);//103

var fn2=

outer()

;fn2()

;// 104

fn2();

// 105

function

outer()

;}return result

}var fn =

outer()

; console.

log(fn[0]

());

// 2

console.

log(fn[1]

());

// 2

分析

解決上面這種問題的思路

立即執行函式

立即執行函式內部再宣告函式

function

outer()

return f2;

}(i);}

return result

}var fn =

outer()

; console.

log(fn[0]

());

// 0

console.

log(fn[1]

());

// 1

JS閉包 及閉包的應用場景

閉包 如大家所知,通俗講,可以訪問其他函式內部變數的函式 建立閉包最常見的方式函式作為返回值 function fn let log fn log 列印 小帆 外部函式訪問內部變數 下面來實現乙個簡單的demo 計數器 var number 0 function creat creat 確實實現了需...

js閉包應用

js閉包一直是比較難說明白的,至少博主是一直都沒弄明白,直到最近複習js,深入看了看執行上下文 博主寫的介紹執行上下文 才慢慢開始理解閉包的含義了。閉包可以說是由於js執行機制而產生的乙個特點,是一種現象 內部的函式可以訪問到外部函式的作用域。mdn在閉包解釋中提到 每當函式被建立,就會在函式生成時...

閉包的應用

閉包是指有權訪問另一函式作用域中變數的函式 閉包是作用域特殊表現形式 1.函式作為引數被出入 2.函式作為返回值被返回 主要作用 延伸了變數的作用範圍 閉包的應用 閉包的作用與優缺點,閉包的應用場景 1.閉包是函式巢狀函式,所以形成了函式變數的區域性作用域,避免變數被全域性汙染 2.當閉包作為返回值...