闭包
前言
提示:这里可以添加本文要记录的大概内容:
闭包是什么,闭包的使用,什么是函数的词法作用,需要注意什么。
提示:以下是本篇文章正文内容,下面案例可供参考
一、闭包是什么?
闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
二、函数的词法作用
示例
函数的作用域,在函数创建时就已经确定的,这就是词法作用域。
函数one是在全局的时候创建的,所以它的作用域就是全局的a,即使在函数two里去调用函数one,也不影响。
代码如下(示例):
let a = '我是1'
function one (){
document.write(a)
}
//one();//a = '我是1'
function two() {
let a = '我是2'
one()
}
two();//a = '我是1'
我们在函数three里面再创建一个函数four,这时函数four会去找自身的变量a,找不到就到函数three里面找,所以函数four里面变量a的值是函数three的a值,返回函数four,在全局调用函数three,赋给一个变量,其实就是在调用函数four。换句话说,函数three中的a只有函数four才能访问,闭包就是利用了词法作用。这里的函数four就是一个闭包。
let a = '我是1'
function three(){
let a = '我是3'
function four() {
document.write(a)
}
return four
}
let res = three()
res()// a = '我是3'
三、闭包的使用
提示:看看上面的代码:
通俗地讲,闭包就是能访问到外部作用域变量的函数,什么时候使用闭包呢?当我们需要隐藏一哦写不希望别访问的内容时就可以使用闭包。
构成闭包的条件:
1、函数必须嵌套使用(套娃)
2、内部函数要引用到外部函数的变量
3、内部函数要作为返回值返回
示例:
我们要调用一个函数,每调用一次数值+1;
function open() {
let a = 0
function ye(){
a++
console.log(a);
}
return ye
}
let res = open()
res()
也可以直接写成箭头函数:
function open() {
let a = 0
return() => {
a++;
console.log(a);
}
}
let res = open()
res()
可以看到控制台打印出的a值不会被外部所修改,那么这就是一个闭包。
四、注意事项
闭包的生命周期
1、闭包在外部函数调用时产生,外部函数每次调用都会产生一个全新的闭包;
2、在内部函数丢失是销毁(外部调用 = null,内部函数被垃圾回收,闭包消失);
闭包的注意事项
闭包主要用来隐藏一些不希望被外部所访问的内容,也就是闭包要占用一定的内存空间,每重新创建一个新的闭包他会重新开辟一个空间,而且都是一样的闭包。相较于类来说,闭包比较浪费内存空间(类可以使用原型而闭包不可以),需要执行次数少时,使用闭包,次数多时,使用类的封装。