这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战
今天我们来学学闭包吧~~~~
🍻首先来看我们的题目嗷
let x = 5;
function fn(x){
return function(y){
console.log(y+(++x))
}
}
let f = fn(6);
fn(8)(9);
f(10);
console.log(x);
我们一步步来分析吧,首先变量提升fn,作用域为[[scope]],EC(G),开辟堆内存,我们暂且称之为0x000,然后代码进栈执行,let x = 5;在GO定义了一个变量,function fn(x){}这个我们在变量提升阶段做过的事,这里浏览器就不会再执行啦,let f = fn(6);其作用域为[[scope]],EC(FN1),我们在GO中定义为 return function(y){console.log(y+(++x))}开辟一个全新的堆内存,当前私有上下文中的某些内容被当前上下文以外的事物所占用,就不能出栈释放,这里我们可以延伸前端性能优化方案之内存优化,内存优化释放一些没必要的内存空间,以此优化产品的运行速度,堆内存浏览器对内存回收,有自己的处理方案,标记清除(谷歌)&引用计数(IE),对于堆内存来讲,只要有其他事物占用这个堆内存(存储这个对内存地址),那么浏览器在空闲下来的时候,不会清楚被占用的堆内存,但是会清楚没被占用的堆内存,手动解除占用变量=null,栈内存(执行上下文) @1 全局执行上下文,页面打开的时候生成,只有页面关闭,上下文才会释放。@2函数/块级/私有上下文:函数执行/代码执行的时候产生的,一般情况下,代码执行完,会自动出栈释放,但是有特殊情况,当前的私有的上下文中的某些内容(或者和它关联的内容)如果被当前上下文以外的事物占用,不仅关联的东西不被释放,同理此次的私有上下文也不能被释放
- 保证私有上下文中的私有变量和外界的变量没有任何关系保护功能
- 还可以把私有变量和对应的值保存起来,供其下级上下文使用 保存功能,我们把函数执行的这种机制称之为闭包
fn(8)(9);我们会生成一个全新的私有上下文,私有的x为8,立即会执行其返回结果私有y为9其结果为18,f(10);,私有的y值为10,自己没有私有变量x,向其上级作用域中x的值为5,其结果为17,全局的x的值为5~~~~