闭包:函数里面的函数
- 作用一:在函数外部可以通过另一个函数,访问到函数内部的局部变量,即函数内部局部变量被保留。
- 作用二:可以处理私有。即在外部并不能直接访问局部变量,必须通过函数接口return出去。
没有闭包:
function func(){
let i = 0;
return i;
//块作用域:在块内执行完会被垃圾回收机制自动回收
}
//在函数外部想访问到函数内部定义的局部变量。 希望这个变量被保留。
console.log(func());
console.log(func());
console.log(func());
//输出 0 0 0
闭包:
//先定义一个函数func
function func(){
let i = 0; //私有变量i
//再定义一个函数func1使用这个i,使i被保留
function func1(){
i++;
return i;
}
//返回该函数
return func1;
}
let func2 = func();
console.log(func2());
console.log(func2());
console.log(func2());
//输出 1 2 3
缺点:变量常驻内存,不再块内被释放,可能造成内存浪费。
闭包中let和var的区别:
function func(){
let arr = [];
for(let i = 0;i < 10;i++){ //i用let定义,i被绑定在定义的块内,每执行一次都被释放
//闭包
arr[i] = function(){ //数组里面存放函数
return i; //返回i
}
}
return arr;
}
let arrFunc = func();
for(let i = 0;i < arrFunc.length;i++){
console.log(arrFunc[i]());
}
//输出 0~9
function func(){
let arr = [];
for(var i = 0;i < 10;i++){ //i用var定义,且是闭包,i在块内被保留下来
arr[i] = function(){
return i; //每一次返回的i都是10
}
}
return arr;
}
let arrFunc = func();
for(let i = 0;i < arrFunc.length;i++){
console.log(arrFunc[i]());
}
//输出 10个10