复习一下什么是闭包

什么是闭包

官方概念:闭包是指有权访问另一个函数作用域中的变量的函数。

可以理解为,一个作用域可以访问另一个函数内部的变量。

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());//数组已经遍历完

猜你喜欢

转载自blog.csdn.net/weixin_45032067/article/details/126276083
今日推荐