一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情。
1. 是什么?
闭包是什么?很简单的问题,但是好像它的定义不是过于拘泥文案就是晦涩难懂,反正我是各种懵,各种不懂;闭包究竟是什么呢?还是先来看一下定义吧:
-
闭包:闭包指的是那些引用了另一个函数作用域中变量的函数,通常是在嵌套函数中实现的。--- 红宝书
-
闭包: 函数对象与作用域(即一组变量绑定)组合起来解析函数变量的机制,在计算机科学文献中被称为闭包。--- 犀牛书
-
闭包: 一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。--- MDN
从上面的定义上看,不知道大家是不是能懂闭包究竟是什么?红宝书、犀牛书、MDN是我们很多前端程序员查询资料的选择,但是面对这些定义,我是真的有些头大。 先不提这些头疼的定义,先看一下下面的问题:
2、 为什么?
- 你为什么用闭包呢?
- 闭包可以私有化变量,避免其受到外部干扰。
- 闭包可以长久保存变量
浏览器会进行垃圾回收,一般函数执行完毕后,其用到的变量会被销毁,但闭包中的变量会被长久保存
- 你为什么不用闭包呢?
- 闭包可能会意外的共享不该被共享的变量
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. 闭包有怎样的展现形式?
- 函数作为返回值被返回
let a = 200;
function returnFn(){
let a = 100;
return function(){
console.log(a)
}
}
returnFn()()//100
- 广义上所有函数都是闭包函数
6. 怎么回答
- 问定义:广义上来说所有函数都是闭包,但我们通常说的闭包指有权访问另一个函数作用域中变量的函数,也可以理解为只要内层函数可以访问外层函数的作用域,就存在闭包。它可以将变量私有化,更好的保存和保护变量,但于此同时也要注意是否需要手动将变量设置为null,常用在防抖截流等方法上。
- 考察具体题目:只需要记住词法作用域的基本规则:Javascript函数是使用定义它们的作用域来执行的。也就是说,考察闭包的题目肯定会涉及到或者说难点是自由变量的值是多少,就需要你记住: 所有的自由变量的查找,是在函数定义的地方,向上级作用域查找,而不是在执行的地方;