javascript内存泄漏的原因有哪些

javascript内存泄漏的原因:1、全局变量使用不当;2、闭包使用不当;3、延时器或定时器没有被清除;4、没有清理的DOM元素引用(dom清空或删除时,事件未清除)。

javascript内存泄漏的原因有哪些

本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。

内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。即指由于疏忽或错误造成程序未能释放已经不再使用的内存。 内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。这里就讲一些常见会带来内存泄露的原因。

1. 全局变量

JavaScript可以处理没有声明的变量:一个未声明的变量的引用在全局对象中创建了一个新变量。在浏览器的环境中,全局对象是window。

function foo(){  name = '前端曰';}// 其实是把name变量挂载在window对象上function foo(){  window.name = '前端曰';}// 又或者function foo(){  this.name = '前端曰';}foo() // 其实这里的this就是指向的window对象

登录后复制

这样无意中一个意外的全局变量就被创建了,为了阻止这种错误发生,在你的Javascript文件最前面添加 ‘use strict;’ 。这开启了解析JavaScript的阻止意外全局的更严格的模式。或者自己注意好变量的定义!

立即学习“Java免费学习笔记(深入)”;

2. 闭包

闭包:匿名函数可以访问父级作用域的变量。

var names = (function(){      var name = 'js-say';    return function(){        console.log(name);    }})()

登录后复制

闭包会造成对象引用的生命周期脱离当前函数的上下文,如果闭包使用不当,可以导致环形引用(circular reference),类似于死锁,只能避免,无法发生之后解决,即使有垃圾回收也还是会内存泄露。

3. 被遗忘的延时器/定时器

在我们的日常需求中,可能会经常试用到 setInterval/setTimeout ,但是使用完之后通常忘记清理。

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

登录后复制

setInterval/setTimeout 中的 this 指向的是window对象,所以内部定义的变量也挂载到了全局;if 内引用了 someResource 变量,如果没有清除 setInterval/setTimeout 的话someResource 也得不到释放;同理其实 setTimeout 也一样。所以我们用完需要记得去 clearInterval/clearTimeout。

4、没有清理的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'));    // 此时,仍旧存在一个全局的 #button 的引用    // elements 字典。button 元素仍旧在内存中,不能被 GC 回收。}

登录后复制

【推荐学习:javascript高级教程】

以上就是javascript内存泄漏的原因有哪些的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2943871.html

(0)
上一篇 2025年3月11日 22:19:43
下一篇 2025年3月11日 22:19:50

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JavaScript中数据类型转换函数有哪些

    数据类型转换函数有:toExponential()、toFixed()、toPrecision()、String()、getDate()、getFullYear()、Number()、parseFloat()、parseInt()等等。 本…

    2025年3月11日
    200
  • javascript中什么是回流

    在javascript中,回流也叫做重排,是指当渲染树中的一部分或全部因为元素的规模尺寸、布局、隐藏等改变时,浏览器重新渲染部分DOM或全部DOM的过程;简单来说,就是重新排版整个页面。 本教程操作环境:windows7系统、javascr…

    2025年3月11日
    200
  • javascript的dom事件有哪些

    js dom事件有:abort、afterprint、blur、canplay、change、click、copy、cut、dblclick、drag、drop、ended、error、focus、open、load、play等等。 本教程…

    2025年3月11日
    200
  • javascript语言与操作环境有关吗

    javascript语言与操作环境无关。javascript依赖于浏览器本身,不依赖操作系统,在浏览器中就可以运行;因此一个JavaScript脚本在编写完成后可以在任意系统上运行,只需要系统上的浏览器支持JavaScript即可。 本教程…

    2025年3月11日
    200
  • javascript读什么

    javascript的英式读音为“ˈdʒɑːvəskrɪpt”,美式读音为“ˈdʒɑvəˌskrɪpt”;它是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。 本教…

    2025年3月11日
    200
  • javascript的值类型有哪些

    javascript的值类型有6种,分别为:1、String类型;2、Number类型;3、Boolean类型;4、Null类型;5、Undefined类型;6、Symbol类型,表示独一无二的值。 本教程操作环境:windows7系统、j…

    2025年3月11日
    200
  • javaScript的标记符是什么

    在javaScript中,标记符是用户编程时使用的名字,用于给变量、常量、函数、语句块等命名,以建立起名称与使用之间的关系。合法标记符的第一个字符必须是字母、下划线或美元符号,且不能与JavaScript关键字、保留字重名。 本教程操作环境…

    2025年3月11日
    200
  • javascript和java语法一样吗

    javascript语法和java语法不一样。JavaScript是弱类型语言,在声明变量的时候不用规定变量的类型,可以统一使用var关键字来定义;而java是强类型的语言,必须用对应类型来声明变量。 本教程操作环境:windows7系统、…

    2025年3月11日
    200
  • javascript用什么引擎做游戏

    javascript做游戏可用的引擎:1、Babylon.js;2、Three.js;3、Turbulenz;4、Famo.us;5、PlayCanvas.js;6、Goo Engine;7、CooperLicht;8、Voxel等。 本教…

    2025年3月11日
    200
  • javascript闭包啥意思

    在javascript中,闭包指的就是一个函数;当两个函数彼此嵌套时,内部的函数就是闭包。典型的闭包体是一个嵌套结构的函数;内部函数引用外部函数的私有成员,同时内部函数又被外界引用,当外部函数被调用后,就形成了闭包。 本教程操作环境:win…

    2025年3月11日
    200

发表回复

登录后才能评论