闭包函数以及内存泄漏、垃圾回收机制

闭包:函数执行,形成私有的执行上下文,使内部私有变量不受外界干扰,起到保护和保存的作用。
作用:①保护:避免命名冲突;②保存:解决循环绑定引发的索引问题;③变量不会销毁:可以使用函数内部的变量,使变量不会被垃圾回收机制回收。
应用:设计模式中的单例模式;for循环中的保留i的操作;防抖和节流;函数柯里化。
缺点:内存泄漏

闭包的3个特性

  • 函数嵌套函数
  • 函数内部可以引用函数外部的参数和变量
  • 参数和变量不会被垃圾回收机制回收
//1.函数作为返回值
function test(){
	const name = "haoran";
	return function(){
		return name;
	}
}

const fn = test()
console.log(fn())    //haoran
//2.函数作为参数
function test(fn){
	const a = 1;
	fn();
}

const a = 2;
function fn(){
	console.log('a',a)
}

test(fn)	//a 2
//3.定时器与闭包        
/* i++ 与 ++i的主要区别:         
01.i++返回原来的值,++i返回加1后的值        
02.i++不能作为左值,而++i可以        */        
for (var i = 0; i < 5; ++i) {
    setTimeout(function() {
       console.log(i + '');            
    }, 1000);        
}   
//⑤5        
for(var i = 0; i < 5; ++i){            
    (function(i){                
         setTimeout(function() {
             console.log(i + ' ');                
         }, 1000);            
     }(i))        
}   //0 1 2 3 4 5       
 //②闭包作为参数传递                
 var num = 15        
 var fn1 = function(x){           
     if(x>num){                
       console.log(x);            
     }        
  }        
    void function(fn2){            
    var num = 100            
    fn2(30)        
}(fn1)  //30

总结:
好处
1.保护函数内的变量安全,实现封装,防止变量流入其他环境发生命名冲突。
2.在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)
3.匿名自执行函数可以减少内存消耗
坏处
1.被引用的私有变量不能被销毁,增加了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值null
2.由于闭包涉及跨域访问,所以会导致性能损失,可通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响
内存、垃圾回收机制
内存泄漏:不再使用的内存没有被及时释放出来,导致该段内存无法被使用。
为什么会导致内存泄漏:内存泄漏指我们无法在通过js访问某个对象,而垃圾回收机制却认为该对象还在被引用,因此垃圾回收机制不会释放该对象,
导致该内存永远无法释放,积少成多,系统会越来越卡以至于崩溃
垃圾回收机制都有哪些策略?
标记清除法、引用计数法
防抖和节流
防抖:n秒后在执行该事件,若在n秒内被重复触发,则重新计时
节流:n秒内只运行一次,若在n秒内被重复触发,只有一次生效


版权声明:本文为weixin_48912846原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。