什么是闭包
闭包:如果函数内的变量根据语法作用域,要引用到函数外的变量,那么这个变量就会被保存起来,像放进一个背包一样跟随着函数的定义.他的特点是:
- 随着函数的定义而存亡,不随外部环境的灭亡而灭亡
- 保存不同的词法环境
function saveName(name) {
return () => {
alert(name)
}
}
let getName1 = saveName('deibo')
let getName2 = saveName('tutu')
getName1()
getName2()
运行上面的代码,可以发现getName1()()和getName1()的返回值分别是'deibo'和'tutu'.这说明在创建箭头函数时保存了不同的词法环境
闭包的用途
根据闭包的特点,可以用来做数据隐藏和封装,如:
1.从外部访问局部变量
function fn1(){
let name='tutu'
return function fn2(){
return name
}}
let fn3 = fn1()
fn3()
// fn3返回的值就是局部变量name的值'tutu'
2.私有方法
如下,fn2成为了obj的私有方法,只能通过obj.fn3()调用
function fn1() {
let name = 'tutu'
function fn2() {
return 'only fn3'
}
return {
account: name,
fn3: function () { return fn2() }
}
}
let obj = fn1()
console.log(obj.fn3());
// 打印了'only fn3'
闭包的缺点
影响性能,因为更多的闭包,更多的函数,更多的内存
为了保存不同的环境状态会不断地创建新的函数,然而函数的定义却是相同的.所以如果不是某些特定任务需要使用闭包,在其它函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响。
例如,私有方法中的例子,如果用这种方式创建对象,每次创建对象都会声明新的函数,会占用更多的内存.所以如果不是特殊考量,应该用prototype的方法.