JS之闭包

56 阅读2分钟

内容主要是关于闭包,在这之前先会认识一下函数的过程,和不会被销毁的内存空间,因为这都是形成闭包的必要条件,了解闭包的前提需要了解这两点知识。

认识函数的过程:

定义:在堆中开辟一段存储空间,把函数体的内容完全百分百的照抄一份存在内存空间中,把该内存空间的地址赋值给函数名。

调用:根据函数名存储的内存地址去堆内存中找到对应的函数,然后去运行内存中开辟一段新内存,用于运行函数(函数的作用域),经过形参赋值-----预解析-----函数代码全部执行结束,完毕之后这段内存空间会被销毁。

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