概念介绍
闭包(MDN):
闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包会随着函数的创建而被同时创建。
闭包(代码之髓):
为什么把这称为闭包?一个包含了自由变量的开放表达式,它和该自由变量的约束环境组合在一起后,实现了一种封闭的状态。
自由变量:比如在下列函数中 countAdd 使用了变量 count,然而该变量并不是在函数countAdd 中定义的。这种变量被称为自由变量。
作用域与对照表:
对照表,名字和内容之间的指向 比如 count 指向 0
作用域简单来说就是名字的作用范围,一般来说在调用函数时会为其创建一个新的对照表
一个简单的闭包实现:
function createCountAdd(){
let count = 0;
const countAdd = function(){
count++
console.log(count)
}
return countAdd
}
const countAdd = createCountAdd()
countAdd()
在调用createCountAdd()函数时,会将其对照表一并带出,countAdd的作用范围便是createCountAdd。countAdd函数在使用count变量时,会先在自身对照表中寻找,找不到时在上一层对照表中寻找,因此每次使用的修改的都是count。
将内部函数提出来,从全局的角度来看,这不也是个闭包吗? 将其放到函数作用域中的好处是,可以将该变量私有化,不会被别的函数所污染。
let count = 0;
const countAdd = function(){
count++
console.log(count)
}
countAdd()
小随笔,欢迎指正