☀️一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情
闭包
闭包指的是那些引用了另一个函数作用域中变量的函数。 通常在嵌套函数中实现。
- 在函数中返回一个函数 内部函数可以访问到外部函数的作用域 一般函数的词法环境在执行完就被销毁 而闭包保存着创建的词法环境 延长变量的生命周期
闭包用法
- 设置私有方法--计数器
- 函数柯里化
- 延长变量的生命周期
误解: 匿名函数常被误认为是闭包。
function A() {
//这里面是A的函数作用域
let A_name = 'Macc';
return function() {
//这里是匿名函数的作用域
console.log(A_name);
}
}
let closure = A();
closure(); //Macc
看上面的代码,全局作用域中有个A函数,A函数的作用域中有个变量A_name,然后A函数的返回值是一个匿名函数,注意的是,这个匿名函数在它自己的作用域中引用A作用域中的变量。所以我们称这个匿名函数为闭包函数。
可以看到的是,当我们执行这个匿名函数的时候,它是能成功输出变量A_name的值的,但是正常来说,函数执行完后,其作用域内的变量应该被销毁掉的,当然,这是后面讲的,现在我们继续学会区分什么是闭包。
function A() {
//这里面是A的函数作用域
let A_name = 'Macc';
return function() {
let _name = 'Deing';
console.log(_name);
}
}
let closure = A();
closure(); //Deing
再看上面的这一段代码,和上上面的代码唯一不同的地方就是这次匿名函数内部并没有引用A函数作用域中的变量,所以这个匿名函数不是闭包函数。
经过上面的两个例子,我们大概能明白,是不是闭包函数的其中关键的一点就是是否有引用其他函数作用域中的变量。
我们再往深一点追究,可以发现定义中出现的一个词语:函数作用域。 所以,想要理解闭包,那么理解作用域链的创建和使用细节 是非常重要的。