什么是闭包
官方概念:闭包是指有权访问另一个函数作用域中的变量的函数。
可以理解为,一个作用域可以访问另一个函数内部的变量。
function fn() {
let a = 1;
return function() {
console.log(a)
}
}
const p = fn()
p() // 1
闭包的优缺点
优点:
- 变量不会被销毁
- 延长变量的作用范围
- 可以定义私有属性和私有方法
缺点:
- 变量长期存在内存中,使用不当容易造成内存泄漏(栈溢出),造成内存的浪费,对于不使用的变量引用及时设置为null
闭包的使用场景
获取当前索引,模拟块级作用域
for(var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i)
},0)
}
// 5 5 5 5 5 每次都会拿到循环结束后的i
-----------------------------------------------------------
for(var i = 0; i < 5; i++) {
(function(j) {
setTimeout(() => {
console.log(j)
},0)
}
)(i)
}
// 0 1 2 3 4 立即执行函数是闭包函数,形成了一个局部块级作用域
模块封装,在各模块规范出现之前,都是用这样的方式防止变量污染全局
var a = (function(){
var foo = 0;
function a() {}
a.prototype.bar = function bar() { return foo}
return a
}());
迭代器(执行一次函数往下取一个值)
var arr =['a','b','c'];
function incre(arr) {
var i=0;
return function() {
//这个函数每次被执行都返回数组arr中 i下标对应的元素
return arr[i++] || '数组值已经遍历完';
}
}
var next = incre(arr);
console.log(next());//a
console.log(next());//b
console.log(next());//c
console.log(next());//数组已经遍历完