闭包作用域的一点理解

195 阅读1分钟

1.创建函数

1.开辟一个堆内存
2.把函数中的代码当字符串存进去
3.把堆内存的地址赋值给函数名或者变量名

函数在哪创建,它执行时候的上级作用域就是谁

2.函数执行

1.形成一个全新的私有作用域(栈内存,执行上下文),执行一次,形成一次,执行之后由js垃圾回收机制回收,相互之间不会产生影响
2.形参赋值,变量提升。
3.代码执行(把所属对内心中的字符串拿出来执行)
4. 执行时遇到变量,先看他是不是私有变量,如果是私有变量,就操作私有变量,如果不是私有变量,择沿着作用域链向上级查找,直到找到window为止
5.私有变量和外部变量吗必然关系,课理解为私有栈内存保护起来了,这种机制就是闭包的保护机制

3.函数执行就会形成闭包,但是执行过后就被释放了,大部分说法是函数执行形成了不被释放的栈内存才叫闭包,

function fn(){
    let i=1
    return function (a){
        console.log(++i,++a)
    }
}
let f=fn()
f(1) //2,2
f(1) //3,2
f(3) //4,4