JavaScript面试精讲(八)——请谈谈JS中常见的几种内存泄漏情况

JavaScript面试精讲(八)——请谈谈JS中常见的几种内存泄漏情况,第1张

一.什么是内存泄漏

由于疏忽或错误造成程序未能释放不在使用的内存,如果不及时释放,会造成内存占比越来越高,对项目中的内存会造成很大的影响

二.常见的几种情况 1.意外的全局变量

如下代码:a没有定义类型,会默认全局变量,按理说执行完函数就应该对a进行销毁,但是以外的全局变量不会销毁

简单理解:无用的内存还在占用,得不到释放和归还,比较严重的时候,无用的内存还会增加,从而导致整个系统卡顿,甚至崩溃

 

function fun(){
  a=10
   console.log(a);
  
}
fun()
console.log(a);

还有一种情况用this 创建,此时this 指向window 也会造成意外全局变量

function fun(){
  this.a=10
   console.log(a);
  
}
fun()
console.log(a);
2.定时器

如下代码:两秒钟后输出这句话,导致定时器的回调函数及其内部依赖的变量都不能被回收,这样也会造成内存泄漏

var hellow='你是一个优秀的前端工程师'
setTimeout(()=>{
  console.log(hellow);
  
},2000)

解决办法:当不需要interval或者timeout的时候,调用clearInterval或者clearTimeout

 

var hellow='你是一个优秀的前端工程师'
 const time= setTimeout(()=>{
  console.log(hellow);
  clearTimeout(time)
  
},2000)
3.闭包

闭包可以维持函数内局部变量,使其得不到释放。

function fun(name){
  function  fun1(){
    console.log(name);
    
  }
  return fun1
}
var fn=fun('张三')
fn()
fn()
fn=null //进行释放
 4.console

控制台日志记录对总体内存内置文件的影响,也是个重大的问题,同时也是容易被忽略的。记录错误的对象,可以将大量的数据保留在内存中。传递给console.log的对象是不能被垃圾回收,所以没有去掉console.log可能会存在内存泄漏~~~~

总结:

怎样避免内存泄露

1)减少不必要的全局变量,或者生命周期较长的对象,及时对无用的数据进行垃圾回收;

2)注意程序逻辑,避免“死循环”之类的 ;

3)避免创建过多的对象 原则:不用了的东西要及时归还。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1295175.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存