javascript
JavaScript-内存空间
深入了解js這門語言后,才發現它有著諸多眾所周知的難點(例如:閉包、原型鏈、內存空間等)。有的是因為js的設計缺陷導致的,而有的則是js的優點。不管如何,總需要去學會它們,在學習過程中我覺得只看別人的文章并不能做到深刻理解,所以我決定寫這一系列的文章來記錄我所學習到的知識點,也方便自己以后回顧,如有寫錯的地方歡迎指正。?
廢話不多說,馬上進入正題!
一、基本數據類型和引用類型
JS中有五種基本數據類型:Undefined、Null、Boolean、Number和String。這些基本數據類型是存儲在棧內存空間內的,我們可以直接操作棧內存中的值,稱之為按值訪問。這個棧內存類似于數據結構中的棧,也是遵循后進先出的原則。?
除了基本數據類型,JS還有引用類型。引用類型的值是保存在內存中的對象,JS不能直接操作對象的內存空間,也就是說我們在操作對象時操作的是對象的引用而不是實際的對象。為此,引用類型的值是按引用訪問的。?
兩者之間的存儲方式不同導致了復制時會產生不同的影響。?
?
如上圖,把num1的值賦值給num2后,num1和num2的值是相互獨立互不影響的。而當從一個變量向另一個變量復制引用類型的值時,復制的值實際上是一個指針。復制結束后兩個變量的指針將引用存儲在堆內存中的同一個對象。因此改變其中一個變量會影響到另一個變量。?
二、內存空間管理
JS具有自動垃圾收集機制,垃圾收集器會按照一定的時間間隔周期性地執行回收內存的操作。
而JS的內存生命周期分為三個周期:
1.分配需要的內存?
2.使用分配到的內存進行操作?
3.使用完畢后被回收
用一個變量num的創建銷毀來舉例子
var num = 20; // 給變量num分配內存空間 console.log(num + 1); // 使用num變量 num = null; // 使用后釋放內存空間- 1
- 2
- 3
JS最常用的垃圾收集方式是標記清除(mark-and-sweep)。當局部變量的環境執行完畢后,局部變量就離開了其執行環境,這時它就會被自動地打上標記,等到下個垃圾收集操作時間到來時垃圾收集器就會回收變量占用的內存空間。對于全局變量,我們也可以像上例所示把null賦值給num,這樣num就被手動地打上標記而被垃圾收集器回收。
三、內存泄露
所謂內存泄露就是指一些錯誤的使用導致其占用的內存空間即使不再使用也無法被正?;厥?。常見的內存泄露有四種:?
1.多余的全局變量
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2.遺忘的定時器
function func() {var timer = setInterval(function(){console.log("123");},1000); } func(); func = null; // 即使釋放了func的內存空間,定時器也會繼續執行。必須手動釋放定時器 // clearInterval(timer);- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3.沒有清理的DOM引用
var elements = {button: document.getElementById("button") }; document.body.removeChild(document.getElementById("button")); //盡管我們移除了button元素,但elements對象里還保存著#button的引用。所以button元素所占用的內存空間不會被垃圾收集器回收。- 1
- 2
- 3
- 4
- 5
4.閉包
var leaks = function(){ var leak = 'xxxxxx'; // 被閉包所引用,不會被回收return function(){console.log(leak);} }; leaks();總結
以上是生活随笔為你收集整理的JavaScript-内存空间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RESTful API 编写规范
- 下一篇: javascript-排序算法