JavaScript这几种内存泄露写法

在这里插入图片描述

1. 未声明 / 意外的全局变量

第一种,未声明或者意外的全局变量。全局变量的生命周期最长,直到页面关闭前,它都存活着,所以全局变量上的内存一直都不会被回收。所以当我们写代码的时候如果全局变量使用不当,没有及时回收,或者拼写错误将某个变量挂载到全局变量时,就会发生内存泄漏了。

var a = '这是一个全局变量';
function test(){  
    b = '变量 b'; //b 成为一个全局变量,不会被回收
}

这段代码中,test 函数中定义了一个变量 b,没有使用 var 或者 let 变量进行声明,这时 b 会成为全局变量,test 执行后变量 b 不会被回收。解决方式也比较简单,在 JavaScript 文件中添加'use strict',开启严格模式,这个时候就不能使用 b 这个意外的全局变量了,开发时就会在浏览器控制台报错,避免这种情况发生。

2. 遗忘的定时器

var someData = getData();
var intervalId = setInterval(function() {
    var node = document.getElementById('Node');
    if(node) {
        node.innerHTML = JSON.stringify(someData));
    }
}, 1000);

// 在不使用的时候进行清除
clearInterval(intervalId)
3. 事件绑定

class Demo extends React.Component {
  componentDidMount() {
    window.addEventListener('resize', this.handleResize);
  }
  componentWillUnmount() {
    window.removeEventListener('resize', this.handleResize);
  }
  handleResize() {
    // handle resize
  }
  render() {
    return <div>test component</div>;
  }
}

4. 闭包
我们都知道,闭包有两个主要作用,一是延伸变量作用域范围,读取函数内部的变量。二是让这些变量的值始终保持在内存中。简单理解就是,一个作用域可以访问另外一个函数内部的局部变量。

function f1() {
  var n = 999;
  // 一个闭包
  function f2() {
    n++; // f2 作为内部函数,有权访问父级函数作用域 f1 中的变量
    console.log(n);
  }
  return f2;
}
var result = f1();
result(); // 1000
result(); // 1001


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值