JavaScript——那些年,让我们头疼的“闭包”
程序员文章站
2022-07-12 14:48:30
...
1.含义
问:什么是闭包?答:由于在JavaScript函数中,只有函数内部的子函数才能读取局部变量,因此,可以把闭包简单理解为”函数内部的函数“。所以在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
问:闭包的用处?答:可以读取函数内部的变量,令这些变量始终保持在内存当中。
2.使用
实例一:闭包简要模型,理解闭包意义
// 在outside中定义一个变量a,值为888,我们想要在外部使用,正常方式无法使用,此时我们可以使用闭包的形式
// 在下面示例中,child函数就是闭包
function outside(){
let a = 888;
function child(){
return a
}
return child
}
const res = outside() // 执行outside函数,返回值为child函数
console.log(res()) // 得到最终的值,还需要执行一下res
上述示例可能不太符合实际,这是用于阐述一种情况。比如可以直接在outside中return a令外部可以访问到,但是涉及操作,值的变化的时候,就会是这样的情况
实例二:每隔1s,打印的内容+1
// 在outside中定义一个变量a,值为888,我们想要在外部使用,正常方式无法使用,此时我们可以使用闭包的形式
// 在下面示例中,child函数就是闭包
function outside(){
var a = 888;
function child(){ // 此时a会一直留在内存中,随着定时器不断变化
a += 1;
return a
}
return child
}
const add = outside() // 执行outside函数,返回值为child函数
setInterval(()=>{
console.log(add()) // 889 890 ....
},1000)
通过闭包的形式,使变量a留在了内存当中,根据定时器不断向上加1,这是例子是否比上面的例子更有说服力呢?
通过以上两个实例我们可以清楚,闭包就是外部函数中的返回值是一个子函数,子函数中有对于外部函数变量的一个操作,使最外部也可以获取到外部函数变量的值。
3.两个有趣的例子
实例一:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
实例二:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());
// 实例一 弹窗结果The Window
// 实例二 弹窗结果My Object
实例一闭包中this指向为window,若想获取内部变量,可以将闭包改为箭头函数
4.高大上的应用场景
那么大家一直在问的闭包,究竟想要实现什么功能呢?
这个以后会扩充,我困了,大家工作的时候也要注意休息,晚安~
4.闭包弊端
-
由于闭包会使变量一直存在内存当中,使内存的消耗过大,所以不能滥用闭包,否则会造成性能上的问题,在IE中会导致内存泄漏。所以我们要在函数退出时,将不使用的变量删除
。 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
总结用法,希望可以帮助到你,
我是Ably,你无须超越谁,只要超越昨天的自己就好~