閉包
1 .閉包是一個(gè)特殊對象,它由執(zhí)行上下文(代號A)與在該執(zhí)行上下文中創(chuàng)建的函數(shù)(代號B)共同組成侠鳄。當(dāng)B執(zhí)行時(shí)异剥,如果訪問了A中變量對象中的值愚屁,那么閉包就會產(chǎn)生济竹;在《你不知道的js》中認(rèn)為函數(shù)B為閉包,但是在chrome中和紅皮書中認(rèn)為函數(shù)A為閉包霎槐。
2 創(chuàng)建閉包主要有3個(gè)特點(diǎn)送浊,分別是:
用外層函數(shù)封裝受保護(hù)的變量及內(nèi)層函數(shù)
將內(nèi)層函數(shù)返回到外層函數(shù)外部
調(diào)用外層函數(shù),獲得內(nèi)層函數(shù)的對象
// demo1.1
function foo (){
var a = 10;
function bar() {
return a;
}
return bar;
};
var bar = foo();
bar();
反例:
// demo02
var fn;
var m = 20;
function foo() {
var a = 2;
function baz(a) {
console.log(a);
}
fn = baz;
}
function bar() {
fn(m);
}
foo();
bar(); // 20
原因:m屬于全局變量丘跌,不屬于函數(shù)foo的內(nèi)部變量袭景,函數(shù)執(zhí)行時(shí)并沒有調(diào)用其執(zhí)行上下文中的變量a,所以這并不存在閉包闭树;可見閉包生成的兩個(gè)必備的條件是:
1耸棒、在函數(shù)內(nèi)部創(chuàng)建新的函數(shù);
2报辱、新的函數(shù)在執(zhí)行時(shí)与殃,訪問了函數(shù)的變量對象;
//demo3
function factory(){
var n=1;//局部變量
return funtion(){
return n++;
}
}
var icbd=factory();//第一次調(diào)用閉包的完成函數(shù)
console.log(icbd());//?
console.log(icbd());//?
console.log(icbd());//?
下面是一個(gè)示例 — makeAdder 函數(shù):
function makeAdder(x) {
return function(y) {
return x + y;
};
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
console.log(add5(2)); // ?
console.log(add10(2)); // ?
參考文檔:
https://developer.mozilla.org/zh-CN/docs/web/javascript/closures碍现;
https://yangbo5207.github.io/wutongluo/ji-chu-jin-jie-xi-lie/si-3001-zuo-yong-yu-lian-yu-bi-bao.html幅疼;
https://yangbo5207.github.io/wutongluo/ji-chu-jin-jie-xi-lie/liu-3001-zai-chrome-zhong-guan-cha-han-shu-diao-yong-zhan-3001-zuo-yong-yu-lian-3001-bi-bao.html