闭包怎么有这么多的解读方式,好烦啊

114 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情

1. 是什么?

闭包是什么?很简单的问题,但是好像它的定义不是过于拘泥文案就是晦涩难懂,反正我是各种懵,各种不懂;闭包究竟是什么呢?还是先来看一下定义吧:

  • 闭包:闭包指的是那些引用了另一个函数作用域中变量的函数,通常是在嵌套函数中实现的。--- 红宝书

  • 闭包: 函数对象与作用域(即一组变量绑定)组合起来解析函数变量的机制,在计算机科学文献中被称为闭包。--- 犀牛书

  • 闭包: 一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。--- MDN

从上面的定义上看,不知道大家是不是能懂闭包究竟是什么?红宝书、犀牛书、MDN是我们很多前端程序员查询资料的选择,但是面对这些定义,我是真的有些头大。 先不提这些头疼的定义,先看一下下面的问题:

2、 为什么?

  1. 你为什么用闭包呢?
  • 闭包可以私有化变量,避免其受到外部干扰。
  • 闭包可以长久保存变量
    浏览器会进行垃圾回收,一般函数执行完毕后,其用到的变量会被销毁,但闭包中的变量会被长久保存
  1. 你为什么不用闭包呢?
  • 闭包可能会意外的共享不该被共享的变量
function errfunc(){
	let arr = [];
	for(var i = 0; i < 10; i++){
		arr[i] = () => {
			return i
		}
	}
	return arr;
}
let newArr = errfunc()
console.log(newArr[5]())

这里预期是打印5,但实际打印结果是10;

  • 闭包可能会造成内存泄漏,内部变量长久保存,需要手动置为null;

3. 有什么应用?

最常见的是防抖和截流

4. 闭包究竟在考察什么?

闭包涉及到的知识点很多:作用域&作用域链、词法作用域、垃圾回收、堆栈内存、自由变量等。

5. 闭包有怎样的展现形式?

  1. 函数作为返回值被返回
let a = 200;
function returnFn(){
	let a = 100;
	return function(){
		console.log(a)
	}
}
returnFn()()//100
  1. 广义上所有函数都是闭包函数

6. 怎么回答

  1. 问定义:广义上来说所有函数都是闭包,但我们通常说的闭包指有权访问另一个函数作用域中变量的函数,也可以理解为只要内层函数可以访问外层函数的作用域,就存在闭包。它可以将变量私有化,更好的保存和保护变量,但于此同时也要注意是否需要手动将变量设置为null,常用在防抖截流等方法上。
  2. 考察具体题目:只需要记住词法作用域的基本规则:Javascript函数是使用定义它们的作用域来执行的。也就是说,考察闭包的题目肯定会涉及到或者说难点是自由变量的值是多少,就需要你记住: 所有的自由变量的查找,是在函数定义的地方,向上级作用域查找,而不是在执行的地方;