题处理

let x = 5;
function fn(x) {
return function (y) {
console.log(y+(++x))
}
}
let f = fn(6)
f(7);
fn(8)(9);
fn(10)
答案是:14、18、18
函数执行,产生一个私有上下文,然后进栈,
1.当函数执行完,一般情况下,当前形成的上下文都会出栈释放掉(优化内存),上下文释放,之前存储的私有变量也会释放
2.但是如果当前上下文中某些东西(一般都是堆内存)被当前上下文以外事务占用,则当前上下文不能出栈释放,之前声明的私有变量也被存储起来
市面上会把不能释放的上下文称为“闭包”
闭包是一种机制,函数执行产生的私有上下文,一方面可以保护里面的私有变量不被污染,另一方面如果不释放,私有变量及相关信息也都会存储起来,我们把这种“保护”+“保存”的机制,称之为“闭包”