最直接原因是未声明变量赋值或非严格模式下误用this导致变量挂载全局对象;函数漏写let/const/var、构造函数遗漏new、独立调用函数时this指向全局,均会污染全局环境,引发内存泄漏。

最直接的原因是:变量未声明就赋值,或在非严格模式下误用 this,让本该局部作用域的数据“逃逸”到全局对象(浏览器中是 window,Node.js 中是 globalThis)。这类变量不会被垃圾回收,长期驻留内存,尤其当它们引用大型数组、对象或 DOM 节点时,泄漏会迅速显现。
未声明变量直接赋值
这是最隐蔽也最高频的写法。函数内部漏写 let/const/var,JS 会自动将该变量挂载为全局属性:
-
function loadData() { rawData = fetchBigJson(); }→ 实际等价于window.rawData = ... - 即使函数执行结束,
rawData仍可通过window.rawData访问,无法回收 - 常见于快速调试时临时加日志变量,如
temp = document.querySelector(...),忘记删掉
构造函数调用时遗漏 new
当函数设计为构造函数,但被当作普通函数调用,this 指向全局对象,导致属性意外挂载:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
function Chart(config) { this.data = config.series; }- 若误写
Chart({series: hugeArray})(没加new),this.data就变成window.data - 尤其在类库封装不严、文档缺失时容易踩坑
严格模式缺失 + this 滥用
在非严格模式下,独立调用函数时 this 默认指向全局对象,赋值即污染:
function init() { this.cache = new Map(); }- 单独调用
init()→window.cache被创建 - 现代框架组件方法(如 Vue 的
methods)若未绑定上下文,也可能触发同类问题
解决的关键动作
不是靠人工检查,而是建立防御性习惯:
- 全项目启用
'use strict';—— 未声明变量赋值会直接报错,从源头拦截 - 用 ESLint 规则
no-implicit-globals和no-unused-vars自动检测 - 定期在控制台运行
Object.keys(window).filter(k => !/^(?:document|location|navigator|...)$/.test(k))扫描异常新增属性 - 必要时显式清理:
window.tempData = null;或delete window.tempData;

















