本篇內(nèi)容介紹了“javascript內(nèi)存泄漏有哪些原因”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)建站于2013年開始,先為普洱等服務(wù)建站,普洱等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為普洱企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
javascript內(nèi)存泄漏的原因:1、全局變量使用不當(dāng);2、閉包使用不當(dāng);3、延時(shí)器或定時(shí)器沒有被清除;4、沒有清理的DOM元素引用(dom清空或刪除時(shí),事件未清除)。
本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。
內(nèi)存泄露是指一塊被分配的內(nèi)存既不能使用,又不能回收,直到瀏覽器進(jìn)程結(jié)束。即指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計(jì)錯(cuò)誤,導(dǎo)致在釋放該段內(nèi)存之前就失去了對該段內(nèi)存的控制,從而造成了內(nèi)存的浪費(fèi)。這里就講一些常見會帶來內(nèi)存泄露的原因。
JavaScript可以處理沒有聲明的變量:一個(gè)未聲明的變量的引用在全局對象中創(chuàng)建了一個(gè)新變量。在瀏覽器的環(huán)境中,全局對象是window。
function foo(){ name = '前端曰'; } // 其實(shí)是把name變量掛載在window對象上 function foo(){ window.name = '前端曰'; } // 又或者 function foo(){ this.name = '前端曰'; } foo() // 其實(shí)這里的this就是指向的window對象
這樣無意中一個(gè)意外的全局變量就被創(chuàng)建了,為了阻止這種錯(cuò)誤發(fā)生,在你的Javascript文件最前面添加 ‘use strict;’ 。這開啟了解析JavaScript的阻止意外全局的更嚴(yán)格的模式。或者自己注意好變量的定義!
閉包:匿名函數(shù)可以訪問父級作用域的變量。
var names = (function(){ var name = 'js-say'; return function(){ console.log(name); } })()
閉包會造成對象引用的生命周期脫離當(dāng)前函數(shù)的上下文,如果閉包使用不當(dāng),可以導(dǎo)致環(huán)形引用(circular reference),類似于死鎖,只能避免,無法發(fā)生之后解決,即使有垃圾回收也還是會內(nèi)存泄露。
在我們的日常需求中,可能會經(jīng)常試用到 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對象,所以內(nèi)部定義的變量也掛載到了全局;if 內(nèi)引用了 someResource 變量,如果沒有清除 setInterval/setTimeout 的話someResource 也得不到釋放;同理其實(shí) setTimeout 也一樣。所以我們用完需要記得去 clearInterval/clearTimeout。
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')); // 此時(shí),仍舊存在一個(gè)全局的 #button 的引用 // elements 字典。button 元素仍舊在內(nèi)存中,不能被 GC 回收。 }
“javascript內(nèi)存泄漏有哪些原因”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
本文標(biāo)題:javascript內(nèi)存泄漏有哪些原因
文章轉(zhuǎn)載:http://chinadenli.net/article28/gjegcp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、外貿(mào)網(wǎng)站建設(shè)、定制網(wǎng)站、定制開發(fā)、商城網(wǎng)站、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)