标签:新生代 无法 窗口 事件 两种 listen amp 关闭窗口 情况下
Q: 什么是内存泄露?
A:已经不再使用的内存未能被程序释放,叫内存泄露(memory leak)。
Q: 什么情况下出现内存泄漏?
首先了解一下【垃圾回收】:垃圾回收(英语:Garbage Collection,缩写为GC)在计算器科学中是一种自动的存储器管理机制。当一个计算机上的动态存储器不再需要时,就应该予以释放,以让出存储器,这种存储器资源管理,称为垃圾回收。
A: 当一块内存不再用到,但是垃圾回收机制又无法释放这块内存的时候,就导致内存泄漏。
===========================================================================
出现内存泄露的的几种常见情况:
一、全局变量
由全局变量在程序终止前不会被垃圾回收,而JavaScript对未声明变量的处理方式是在全局对象上创建该变量的引用。浏览器中,全局即window对象,在关闭窗口或刷新前不会释放。
全局变量的情况:
1、未声明变量: a = 1
2、直接调用内含this的构建函数,this会指向window,而this扩展的属性与方法,会绑定到window上
二、闭包也会造成内存泄漏 (先了解下【闭包】:一个函数与它的作用域链构成闭包。)
闭包内的函数内部调用了作用域链中的变量,会新分配内存来存储这些变量,特别是柯里化最容易造成这种问题。
三、setinterval
四、事件监听(EventListener):GC不会对事件监听主动回收,换句话说需要开发者主动处理移除
===============
PS: js回收机制分为两种:“标记清除”&“引用计数”,主流新生代浏览器都是“标记清除”法,只有老款IE(ie8及以下)用的是“引用计数”法,因为“引用计数法”在变量循环调用时会造成内存泄漏,基本被后续浏览器抛弃。
标签:新生代 无法 窗口 事件 两种 listen amp 关闭窗口 情况下
原文地址:https://www.cnblogs.com/liujinyu/p/11400651.html