堆、栈内存的销毁以及闭包和this

690 阅读1分钟

堆内存的销毁

谷歌浏览器:定时消除,每隔一段时间,就会通篇销毁一次,把js中没有被用到的地址,销毁 火狐浏览器:计数消除,根据当前地址的引用个数来决定这个是否要被销毁

栈内存的销毁

全局作用域的销毁:只有当页面关闭的时候才会销毁 私有作用域的销毁,只要函数的返回值是一个引用数据类型,那么这个作用域就不会被销毁

栈溢出、内存泄漏就是栈内存不够用!!

闭包

闭包就是一个变量的保护机制,是一个不销毁的作用域,用来保护变量存储值,利用闭包我们可以实现模块化开发(业务中多人合作)
闭包能多用,用多了容易引起内存泄漏

this

箭头函数中的this是指上级作用域的this,this就是函数执行主体

事件绑定中的this就是当前绑定的元素,自执行函数和定时器中的this是window,this的指向是谁,我们可以通过看点的方式来确定;函数执行点前是谁this就是谁,没点就是window

 var btns = document.querySelectorAll('button');
   [...btns].forEach(item=>{
       item.onclick = function(){
           console.log(this)
       }
   });
   (function(){
       console.log(1,this)
   })();
   ~function(){
       console.log(2,this)
   }();
   !function(){
       console.log(3,this)
   }();


   var obj  = {
       age:100,
       f(){
           console.log(this)
       },
       f2:function(){

       },
       f3:()=>{
           console.log(this)
       }
   }
   // obj.f ===  fn ===  ary[3]
   obj.f() // obj.age
   var fn = obj.f;
   fn(); // window.age
   var ary = [1,2,3,fn];
   ary[3](); // ary.3()

   obj.f3();// obj   window




   function fn2(){
       return ()=>{
           console.log(arguments)
       }
   }
   fn2(1,2,3,4,5)()

   setTimeout(function(){
       console.log(this)// window
   },2000)
   ```