内容主要是关于闭包,在这之前先会认识一下函数的过程,和不会被销毁的内存空间,因为这都是形成闭包的必要条件,了解闭包的前提需要了解这两点知识。
认识函数的过程:
定义:在堆中开辟一段存储空间,把函数体的内容完全百分百的照抄一份存在内存空间中,把该内存空间的地址赋值给函数名。
调用:根据函数名存储的内存地址去堆内存中找到对应的函数,然后去运行内存中开辟一段新内存,用于运行函数(函数的作用域),经过形参赋值-----预解析-----函数代码全部执行结束,完毕之后这段内存空间会被销毁。
function fn() {
let a = 100
console.log(a)
}
fn()
认识不会被销毁的内存空间:
1,函数向外部返回了一个引用数据类型(返回的是引用数据类型的内存地址);
2,外部有一个变量接收这个返回值(外部变量中有变量拿到这个引用地址);
3,为了我们后续能够正常使用,JS不会把这个函数的运行空间销毁(就像已经打开的文件不能删除);
function fn () {
let obj = {
a: 1,
b: 2
}
return obj
}
let o1 = fn()
o1 = 1000
认识闭包:(注意调用的是哪一个函数)
构成条件:
1,需要一个不会被销毁的函数执行空间;
2,需要直接或间接 返回一个函数;
3,内部函数使用着,外部函数的私有变量;
优点:延长变量的作用域(使用时间),函数外部可以使用函数内部的变量。
缺点:因为闭包的存在就一定代表一个函数执行空间不会被销毁,如果大量使用闭包,会导致内存空间占据严重。
function outer() {
let a = 100
let str = 'QF001'
let obj = {
a: 1,
b: 2
}
function inner() {
return a
}
return inner
}
let res = outer()
let newStr = res()
console.log(newStr) // 100