闭包
1 .闭包是一个特殊对象,它由执行上下文(代号A)与在该执行上下文中创建的函数(代号B)共同组成。当B执行时,如果访问了A中变量对象中的值,那么闭包就会产生;在《你不知道的js》中认为函数B为闭包,但是在chrome中和红皮书中认为函数A为闭包。
2 创建闭包主要有3个特点,分别是:
用外层函数封装受保护的变量及内层函数
将内层函数返回到外层函数外部
调用外层函数,获得内层函数的对象
// 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属于全局变量,不属于函数foo的内部变量,函数执行时并没有调用其执行上下文中的变量a,所以这并不存在闭包;可见闭包生成的两个必备的条件是:
1、在函数内部创建新的函数;
2、新的函数在执行时,访问了函数的变量对象;
//demo3
function factory(){
var n=1;//局部变量
return funtion(){
return n++;
}
}
var icbd=factory();//第一次调用闭包的完成函数
console.log(icbd());//?
console.log(icbd());//?
console.log(icbd());//?
下面是一个示例 — makeAdder 函数:
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