亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    javascript內(nèi)存泄漏的原因有哪些

    javascript內(nèi)存泄漏的原因:1、全局變量使用不當(dāng);2、閉包使用不當(dāng);3、延時(shí)器或定時(shí)器沒有被清除;4、沒有清理的DOM元素引用(dom清空或刪除時(shí),事件未清除)。

    javascript內(nèi)存泄漏的原因有哪些

    本教程操作環(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)存之前就失去了對(duì)該段內(nèi)存的控制,從而造成了內(nèi)存的浪費(fèi)。這里就講一些常見會(huì)帶來內(nèi)存泄露的原因。

    1. 全局變量

    JavaScript可以處理沒有聲明的變量:一個(gè)未聲明的變量的引用在全局對(duì)象中創(chuàng)建了一個(gè)新變量。在瀏覽器的環(huán)境中,全局對(duì)象是window。

    function foo(){   name = '前端曰'; } // 其實(shí)是把name變量掛載在window對(duì)象上 function foo(){   window.name = '前端曰'; }  // 又或者 function foo(){   this.name = '前端曰'; } foo() // 其實(shí)這里的this就是指向的window對(duì)象

    這樣無意中一個(gè)意外的全局變量就被創(chuàng)建了,為了阻止這種錯(cuò)誤發(fā)生,在你的Javascript文件最前面添加 ‘use strict;’ 。這開啟了解析JavaScript的阻止意外全局的更嚴(yán)格的模式?;蛘咦约鹤⒁夂米兞康亩x!

    2. 閉包

    閉包:匿名函數(shù)可以訪問父級(jí)作用域的變量。

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

    閉包會(huì)造成對(duì)象引用的生命周期脫離當(dāng)前函數(shù)的上下文,如果閉包使用不當(dāng),可以導(dǎo)致環(huán)形引用(circular reference),類似于死鎖,只能避免,無法發(fā)生之后解決,即使有垃圾回收也還是會(huì)內(nèi)存泄露。

    3. 被遺忘的延時(shí)器/定時(shí)器

    在我們的日常需求中,可能會(huì)經(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對(duì)象,所以內(nèi)部定義的變量也掛載到了全局;if 內(nèi)引用了 someResource 變量,如果沒有清除 setInterval/setTimeout 的話someResource 也得不到釋放;同理其實(shí) setTimeout 也一樣。所以我們用完需要記得去 clearInterval/clearTimeout。

    4、沒有清理的DOM元素引用(dom清空或刪除時(shí),事件未清除

    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 回收。 }

    【推薦學(xué)習(xí):javascript高級(jí)教程】

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)