• 内存泄漏的多种情况


    本文总结自: http://www.jianshu.com/p/24874469dafd

    内存泄漏常见的是如下四种情况,在此只做记录,方便参考,详情可查看以上链接

    1.意外的全局变量

    常见情况如下:

    function a(){
        b= '111'
    }

    根据js语法可知,变量未声明就赋值将视为其作用域为全局作用域

    或者

    function a(){
        this.b= '111'
    }
    a()

    这也会创建一个全局变量

    解决方法:

    可使用"use strict",其禁止全局变量的隐形声明禁止this关键字指向全局作用域

    2.被遗忘的定时器或监听器

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

    这样的代码很常见, 如果id为Node的元素从DOM中移除, 该定时器仍会存在, 同时, 因为回调函数中包含对someResource的引用, 定时器外面的someResource也不会被释放。

    同理: 

    var element = document.getElementById('button');
     
    var a= 1;
    function onClick(event) { element.innerHtml = 'text'; a= 100}
    element.addEventListener('click', onClick);

    也会找出内存泄漏

    解决方案:

    使用完毕后记得清除定时器及监听器

    3.没有清理的dom元素引用

    简单来说就是当元素已经从dom树中移除,但仍然有元素在引用它

    var elements = {
      button: document.getElementById('button'),
      image: document.getElementById('image'),
      text: document.getElementById('text')
    };
    function doStuff() {
      image.src = 'http://some.url/image';
      button.click();
      console.log(text.innerHTML);
    }
    function removeButton() {
      document.body.removeChild(document.getElementById('button'));
    
    }

    这会导致此dom元素不能被回收

    4.闭包

    var theThing = null;
    var replaceThing = function () {
      var someMessage = '123'
      theThing = {
        someMethod: function () {
          console.log(someMessage);
        }
      };
    };
    replaceThing()

    由于闭包的特性,内部能访问外部定义的变量,因此theThing无法回收

    解决方案:

    在replaceThing函数最后加上someMessage= null

  • 相关阅读:
    成为 Team Leader 后我最关心的那些事
    《管理的实践》读书心得
    玩黑客学校CTF
    DHCP中继器
    test
    初窥XSS跨站脚本攻击
    TCP/IP模型
    逻辑漏洞-客户端验证的邮箱-Web渗透实例之中国教育部青少年普法网站逻辑漏洞
    逻辑漏洞-支付风险-大疆某处支付逻辑漏洞可1元买无人机
    逻辑漏洞-密码找回之验证码发给了客户端
  • 原文地址:https://www.cnblogs.com/yanze/p/7921957.html
Copyright © 2020-2023  润新知