`
zuoshaobiao
  • 浏览: 21175 次
  • 性别: Icon_minigender_1
  • 来自: 济南
最近访客 更多访客>>
社区版块
存档分类
最新评论

js 溢出

阅读更多

这些关于js溢出的质料来自 csdn上,并非自己所写。(附件中有完整的测试程序)

 

1.

 

最近接受了一个Js职位的面试,问了很多Js的高级特性,才发现长时间使用已知的特性进行开发而忽略了对这门语言循序渐进的理解,包括Java我想也是一样,偶尔在Sun官方看到JDK6.0列举出来的new features才发现很多东西是自己并不知道或者遗忘了的。看来还是要坚持总结技术,反复理解和运用才能保持对任何技术的掌握运用能力阿。

翻了一些Js的新老资料,准备先讲讲Js的内存泄露问题——
当一个DOM对象包含一个Js对象的引用(例如一个Event Handler), 而这个Js对象又持有对这个DOM对象的引用时,一个环状引用就行成了。这本身并不是什么错误或者Bug,因为Js的回收机制能理解这种环状的引用结构并且在没有其他对象能关联到环上的时候回收这个环上的所有对象内存。可不幸的是IE浏览器中的DOM结构并不受Js解释机制管理,所以它并不能理解这种失去外界引用的环状结构,导致环上任何对象都无法被访问到,可是内存依旧占据着,这也就是所谓的Js内存泄露了。

我们来看一个经典的例子说明问题——

JScript code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> (function(limit, delay){ var queue=new Array(10); var n; function makeSpan(n){ var s=document.createElement(‘span’); document.body.appendChild(s); var t=document.createTextNode(‘ ’+n); s.appendChild(t); s.onclick=function(e){ s.style.backgroundColor=’red’; alert(n); }; return s; } function process(n){ queue.push(makeSpan(n)); var s=queue.shift(); if(s) s.parentNode.removeChild(s); } function loop()}{ if(n<limit){ process(n); n+=1; setTimeout(loop,delay); } } loop(); })(10000,10);



这个例子的意义是创建出10000个span元素来添加到DOM的body上,并且对其内容填充序号n,紧接着从queue的第一个位置移除创建的span元素,也就是说10000个为止,不断的创建再移除,永远只保留最新创建的那10个。这个例子满足的条件就是DOM元素带有Js对象即click事件的Event Handler,而Event Handler里面又带有这个DOM元素的引用,于是环状结构行程。

当我在IE上运行这个Js的时候打开任务管理器,很明显的看到此网页的内存从55M左右起很稳定的增长直到结束第10000个span创建完毕停止增长时已经到了167M,而在Firefox上运行此Js得到的数据是从头到尾内存都不会超过70M。这已经说明IE一直都没有解决这种Js内存泄露的问题,即使我用的版本已经是最新的IE8.0。

可以想象在如今Ajax运用越来越多,用户体验要求越来越高的情况下,网页的体积会越来越庞大,可能很频繁的Js程序员需要做的事情就是在某个DOM元素例如Div里添加很多Html代码,用innerHTML赋值进去,然后用户触发某事件后又整个替换掉innerHTML,那么被替换以前的Html代码很可能带有这样的环状结构,导致页面只要不刷新,内存就会一直泄露着越来越严重,直到吃光机器内存。

所以我们提倡人为的打破这种环状结构, 即在DOM元素被抛弃之前移除绑定在上面的Js Event Handler,移除的方法就涉及到DOM事件模型的讨论范围了,我已在另外一篇讨论文章中详细机讲解W3C标准的DOM事件模型和IE的到底有什么区别了,有兴趣的可以看一看。


2.

 

运行后确实是这样,火狐内存没得啥子显著变化,IE内存直速攀升--!
LZ的代码有点问题哈loop()},修改了下:

JScript code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> window.onload = function() { (function(limit, delay){ var queue=new Array(5); var n = 0; function makeSpan(n){ var s=document.createElement('span'); document.body.appendChild(s); var t=document.createTextNode(''+n); s.appendChild(t); s.onclick=function(e){ s.style.backgroundColor='red'; }; return s; } function process(n){ queue.push(makeSpan(n)); var s=queue.shift();//数组的shift()方法是在数组装满元素才起效,即返回的是元素对象,否则返回undefined if(s) s.parentNode.removeChild(s); } function loop(){ if(n<limit){ process(n); n+=1; setTimeout(loop,delay); } } loop(); })(10000,5); };

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    JS 内存溢出,调试工具介绍

    JavaScript(JS)是一种广泛用于网页和网络应用的脚本语言,它在运行时动态分配内存。然而,不当的编程实践可能导致内存溢出问题,这会影响应用程序的性能甚至导致其崩溃。内存溢出是指程序在申请内存时,无法在预先...

    angular4 JavaScript内存溢出问题.docx

    在开发过程中,Angular 4应用可能会遇到JavaScript内存溢出的问题,尤其是在执行`build --prod`命令时。这种问题通常表现为编译过程中出现错误,提示内存不足。错误信息中提到的`Mark-sweep`和`GC in old space ...

    一行内文本溢出的处理

    在IT行业中,文本溢出是一个常见的问题,尤其是在网页设计、数据处理或日志记录等场景。当文本内容超过其容器的显示范围时,就会发生溢出。标题“一行内文本溢出的处理”直指这个问题的核心,即如何在有限的空间内...

    js精度溢出解决方案

    在标题和描述中提到的“js精度溢出解决方案”,主要是针对在URL参数传递中遇到的数字参数过长导致的精度溢出问题。由于URL是有限制长度的,并且在某些浏览器或服务器端实现中,对URL长度也有一定的限制,因此当需要...

    CSS--文本溢出完美样式

    8. **性能优化**:避免过度依赖JavaScript来处理文本溢出,因为CSS解决方案通常更轻量且性能更好。然而,若需要动态调整文本溢出,JavaScript可以提供更灵活的解决方案。 以上就是关于“CSS--文本溢出完美样式”的...

    处理pdfmarker中文乱码及内存溢出的处理

    ```javascript const pdf = require('pdfmaker'); pdf.create(documentContent, { fontDirectory: 'fonts', fontSize: 12, encoding: 'utf-8' }).download(); ``` 这里的`encoding: 'utf-8'`参数是至关重要的,它...

    FF下文本溢出的text-overflow完美解决方方案

    4. 使用JavaScript库:如果JavaScript是可接受的解决方案,可以考虑使用第三方库,如`ellipsis.js`或`dotdotdot.js`,它们提供了跨浏览器的文本溢出解决方案。 5. 使用CSS Flexbox或Grid布局:现代浏览器支持的...

    jQuery文字溢出显示省略号插件.zip

    它基于一款名为"dotdotdot.js"的JavaScript插件,旨在帮助开发者优雅地处理文字溢出的情况,使长文本在指定区域内以省略号的形式简洁展示。 jQuery是一种广泛使用的JavaScript库,它简化了DOM操作、事件处理、动画...

    文本溢出时显示省略标记

    在这种情况下,我们可能需要使用JavaScript或者CSS预处理器(如Sass或Less)来实现更兼容的解决方案。 在实际应用中,开发者可能会遇到一些挑战,比如在响应式设计中保持省略号的效果,或者在不同屏幕尺寸下调整...

    网页文字溢出显示省略号jQuery插件代码

    这个文件可能包含了HTML结构、CSS样式以及JavaScript代码,用于演示插件的功能和效果。 总的来说,dotdotdot.js插件为网页开发人员提供了一个强大的工具,用于管理和优化文本显示,特别是在响应式设计和移动设备上...

    多行文本溢出显示点点点

    需要注意的是,`-webkit-line-clamp`是非标准的,如果需要跨浏览器兼容性,可以考虑使用JavaScript库如`line-clamp`或者采用其他更复杂的CSS技巧。 多行文本溢出显示点点点在各种场景下都有广泛的应用。例如,在...

    详解基于node的前端项目编译时内存溢出问题

    前段时间公司有个基于vue的项目在运行npm run build的时候会报内存溢出,今天在某个技术流交群也有位小伙伴基于angular的项目也出现了这个问题,所以查了一些相关的资料总结了一下,下面会详细说明前端三大框架编译...

    08-调用栈:为什么JavaScript代码会出现栈溢出?_For_vip_user_0011

    "JavaScript调用栈:为什么JavaScript代码会出现栈溢出?" 在 JavaScript 代码中,调用栈是指 JavaScript 引擎管理函数调用关系的数据结构。它是 JavaScript 引擎背后的工作原理之一,帮助我们了解代码的执行过程和...

    jQuery文字溢出显示省略号插件特效代码

    "jQuery文字溢出显示省略号插件特效代码" 提供了一种优雅的解决方案,它利用JavaScript库jQuery结合dotdotdot.js插件,使得多行文本在溢出时能够自动显示省略号,以保持页面的整洁和专业外观。以下将详细讲解这个...

    Jquery带前后预览图切换效果幻灯片插件下载

    3. **js**:这个目录可能包含了必要的JavaScript文件,包括jQuery库本身和实现幻灯片功能的自定义插件代码。 综合以上信息,这个Jquery幻灯片插件的实现可能涉及到以下技术点: - jQuery选择器和方法,如`.slideUp...

    Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法

    在本文中,我们将深入探讨如何使用Layer.js库来实现表格中溢出内容的省略号显示,并在鼠标悬停时显示全部内容。Layer.js是一个强大的弹层组件,它提供了丰富的功能,包括弹窗、提示、加载层等。在这个场景中,我们将...

    ngBoxBounce:使用CSS转换和动画滚动框上溢出内容的指令

    Angular.js指令可自动沿垂直轴滚动应用到其内容的框内的内容。 仅当内容溢出其父框时才会发生这种情况。 它是通过沿Y轴应用CSS 2D转换来实现的。 有关浏览器的兼容性,请参见2i和上的caniuse.com。 入门 在...

    调用栈:为什么JavaScript代码会出现栈溢出.docx

    "调用栈:为什么JavaScript代码会出现栈溢出" 在 JavaScript 中,调用栈是一种数据结构,用于管理函数调用关系。当我们编写 JavaScript 代码时,可能会遇到栈溢出的错误,这是因为 JavaScript 引擎使用调用栈来管理...

Global site tag (gtag.js) - Google Analytics