常见的面试题什么是闭包
闭包是 JS 的一种 语法特性,其他语言也有这种特性
参考MDN上闭包的定义:
闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。
重点:闭包让开发者可以从内部函数访问外部函数的作用域。
举个例子:
const add2 = function (){
var count = 0
return function add (){ // 访问了外部变量的函数
count += 1
console.log(count)
}
}()
add2() //1
add2() // 2
- 首先定义add2 是一个自动执行函数
- 自动执行函数内部定义了局部变量 count
- 自动执行函数返回值是函数 add
- add2() 就等于调用add函数,所以打印结果为 1
- add2() 再次调用add函数,所以打印结果为 2
我的理解
根据MDN 定义,闭包是一个函数以及其捆绑的周边环境状态的引用的组合。结合上面的例子闭包就是:
闭包 = 函数 add + 自由变量 a,
注意:闭包既不是 函数 add,也不是局部变量 a,而是二者组成的整体
闭包的优点
- 避免全局污染
- 提供了对局部变量的间接访问
- 维持变量,使其不被垃圾回收
闭包的缺点
- 使用不当会造成内存溢出,所以少用闭包