函式的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.當閉包作為返回值...