开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
前言
上章我们介绍了作用域,知道了局部变量不能在全局作用使用,同时作用域遵循就近原则,函数中的变量会使用的到全局变量。如果不想局部变量受到影响就需要用到闭包。
定义
闭包简单来说就是形成了一个不会被回收的环境,将函数里的变量私有化,闭包用处非常广泛,比如:定时器等就是闭包函数,闭包是必须要掌握的知识点。
生成闭包
根据作用域的特点,我们可以来想一下怎么实现一下闭包,首先函数是局部作用域,我们把变量声明到局部作用域,然后在嵌套一个局部作用域,在嵌套的局部作用域使用声明在外面的局部作用域的变量,根据就近原则,嵌套函数不会受到script文件中同名变量的影响。总结起来:
- 函数嵌套一个函数,并将里面的函数当作返回值。
- 里面的函数参数是外面的。
var a = '2';
function f1() {
var a = '1';
function f2() {
console.log(a);//1
}
f2();
}
f1();
如果我们把局部变量a去掉的话,此时f2里面打印的就是'2'。
优缺点
优点
- 让变量私有化,闭包最重要的就是实现了变量的私有,不必担心变量会被回收。
- 实现全局作用域使用局部变量。正常函数这么做会报错:
function f1() {
var a = '1';
}
console.log(a)//Uncaught ReferenceError: a is not defined
利用闭包我们从函数外获取到局部变量。
var closure = (function () {
var a = '1';
function f2(){
return a
}
return{
f2
}
})()
console.log(closure.f2())//1
缺点
可能造成内存泄漏,正是因为闭包会将变量保存起来,不会被垃圾回收机制回收,当闭包用的过多时,内存越老越大就会溢出。所以闭包一定不能滥用,用完的局部变量也可以及时删除减少内存。
总结
闭包能够将变量私有化,形成不会销毁的环境,利用闭包我们可以在全局作用域访问并使用局部变量。通过作用域,我们可以很轻松地理解闭包,闭包很有用但也要注意不要滥用,防止内存泄漏。