函數(shù)fun中定義變量e,這里的e實際上是一個dom對象,javascript判斷對象是否為空 就是判斷是否為 null,那么設(shè)置對象為null,也就是設(shè)置對象為空,javascript的垃圾回收機(jī)制就會自動回收e所占用的內(nèi)存空間。
創(chuàng)新互聯(lián)公司主營桐梓網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App制作,桐梓h5微信小程序開發(fā)搭建,桐梓網(wǎng)站營銷推廣歡迎桐梓等地區(qū)企業(yè)咨詢
還有一點,匿名函數(shù)永遠(yuǎn)保存著它外面的變量 這一點不是很準(zhǔn)確,其實在javascript應(yīng)用中,內(nèi)部函數(shù)使用外部變量或全局變量一般通過閉包的形式,最簡單的形式如下:
function f1(){
var a=1;
return function(){
alert(++a);
}
}
f1();
f1();
至于你說的循環(huán)引用,不是很清楚你具體說的是什么?貌似javascript里沒有這種概念
一.基本類型和引用類型的值
javascript中的變量包含兩種不同數(shù)據(jù)類型的:基本類型值和引用類型值。基本類型值指的是簡單的數(shù)據(jù)段,而引用類型值指那些可能右多個值構(gòu)成的對象。
1.動態(tài)的屬性
定義基本類型值和引用類型值的方式是類似的:創(chuàng)建一個變量并為該變量賦值。但是,當(dāng)這個值保存到變量中以后,對不同類型值可以執(zhí)行的操作則大相徑庭。
對于引用類型的值,我們可以為其添加屬性和方法,也可以改變和刪除其屬性和方法:
var person = new Object();
person.name = "Nicholas";
alert(person.name);// “Nicholas”
基本類型值不能動態(tài)添加:
var name = "Nicholas";
name.age = 27;
alert(name.age);// undefined
2.復(fù)制變量值
復(fù)制變量值時兩種類型也會有所不同。
基本類型:
重新在內(nèi)存中開辟一段空間,賦值前后的兩者相互獨立
引用類型:
雖然也會重新開辟一段空間,但其接受到的值實際上是一個指針,而這個指針指向存儲在堆中的一個對象。賦值操作結(jié)束后,兩個變量實際上將引用同一個對象。
3.傳遞參數(shù)
javascript中所有函數(shù)的參數(shù)都是按值傳遞的。基本類型值的傳遞如同基本類型變量的復(fù)制一樣,而引用類型的值的傳遞,則如同引用類型變量的復(fù)制一樣。
在向參數(shù)傳遞引用類型的值時,會把這個值在內(nèi)存中的地址復(fù)制給一個局部變量,因此這個局部變量的變化會反映在函數(shù)的外部,情況下面例子:
function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count);// 20,沒有變化
alert(result);// 30
引用傳遞:
function setName(obj){
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name);// "Nicholas"
證明對象是按值傳遞的例子:
function setName(obj){
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name);// "Nicholas"
4.檢測類型
在檢測基本類型時typeof是非常得力的助手,但在檢測引用類型的值時,這個操作符的用處不大。通常,我們并不是想知道某個值是對象,而是想知道它是什么類型的對象。為此,javascript提供了instanceof操作符,其語法如下:
result = variable instanceof constructor
alert(person instanceof Object);// 變量person是Object嗎?
alert(colors instanceof Array);// 變量colors是Array嗎?
alert(pattern instanceof RegExp);// 變量parrern是RegExp嗎
二.執(zhí)行環(huán)境和作用域
執(zhí)行環(huán)境是javascript中最為重要的一個概念。執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自的行為。每個執(zhí)行環(huán)境都有一個與之關(guān)聯(lián)的變量對象,環(huán)境中定義的所有變量和函數(shù)都保存在這個對象中。
每個函數(shù)都有自己的執(zhí)行環(huán)境。當(dāng)執(zhí)行流進(jìn)入一個函數(shù)時,函數(shù)的執(zhí)行環(huán)境就會被推入一個環(huán)境棧中。而在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。Javascript中的執(zhí)行流正式右這個方便的機(jī)制控制著。
當(dāng)代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈。作用域鏈的用途是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。作用域鏈的前端,始終都是當(dāng)前執(zhí)行的代碼所在環(huán)境的變量對象。如果這個環(huán)境是函數(shù),則將其活動對象作為變量對象。活動對象最開始只包含一個變量,即arguments對象。作用域鏈中的下一個變量對象來自包含(外部)環(huán)境,直至全局執(zhí)行環(huán)境的變量對象
1.延長作用域鏈
雖然執(zhí)行環(huán)境的類型總共只有兩種——全局和局部(函數(shù)),但是可以延長作用域鏈。因為有些語句可以在作用域鏈的前端臨時增加一個變量對象,該變量對象在執(zhí)行代碼后被移除:
try-catch語句的catch快
with語句
2.沒有塊級作用域
先看如下例子:
if (true){
var color = "blue";
}
alert(color);// "blue"
for (var i = 0; i 10; ++i){
doSomething(i);
}
alert(i); // 10
使用var聲明的變量會自動被添加到最接近的環(huán)境中。在函數(shù)內(nèi)部,最接近的環(huán)境就是函數(shù)的局部環(huán)境;在with語句中,最接近的環(huán)境是函數(shù)環(huán)境。如果初始化變量時沒有使用var聲明,該變量會被添加到全局變量
3.垃圾收集
1.收集方式
標(biāo)記清除、引用清除
2.性能問題(臨界值)
3.管理內(nèi)存(不用的數(shù)據(jù)即使設(shè)置為null)
四.總結(jié)
javascript變量可以用來保存兩種類型的值:基本類型值和引用類型值。基本類型的值源自以下5種基本類型數(shù)據(jù):Undefined、Null、Boolean、Number和String。基本類型值和引用類型值具有以下特點:
基本類型值在內(nèi)存中占據(jù)固定大小的空間,因此被保存在棧內(nèi)存中
從一個變量向另一個變量復(fù)制基本類型的值,會創(chuàng)建這個值的一個副本
引用類型的值是對象,保存在堆內(nèi)存中
包含引用類型值的變量實際上包含的并不是對象本身,而是一個指向該對象的指針
從一個變量向另一個變量復(fù)制引用類型的值,賦值的其實是指針,因此兩個變量最終都指向同一個對象
確定一個值是哪種基本類型可以使用typeof操作符,而確定一個值是哪種引用類型可以使用instanceof操作符
所有變量(包括基本類型和引用類型)都存在于一個執(zhí)行環(huán)境(也稱為作用域)當(dāng)中,這個執(zhí)行環(huán)境決定了變量的聲明周期,以及哪一部分代碼可以訪問其中的變量。以下是關(guān)于執(zhí)行環(huán)境的幾點總結(jié):
執(zhí)行環(huán)境有全局執(zhí)行環(huán)境(也成為全局環(huán)境)和函數(shù)執(zhí)行環(huán)境之分
每次進(jìn)入一個新執(zhí)行環(huán)境,都會創(chuàng)建一個用于搜索變量和函數(shù)的作用域鏈
函數(shù)的局部環(huán)境不僅有權(quán)訪問函數(shù)作用域中的變量,而且有權(quán)訪問其包含(父)環(huán)境,乃至全局環(huán)境
全局環(huán)境只能訪問在全景環(huán)境中定義的變量和函數(shù),而不能直接訪問局部環(huán)境中的任何數(shù)據(jù)
變量的執(zhí)行環(huán)境有助于確定應(yīng)該合適釋放環(huán)境
javascript是一門具有自動垃圾收集機(jī)制的編程語言,開發(fā)人員不必關(guān)心內(nèi)存分配和回收問題。可以對Javascript的垃圾收集例程作如下總結(jié):
離開作用域的值將被自動標(biāo)記為可以回收,因此將在垃圾收集期間被刪除
“標(biāo)記清除”是目前主流的垃圾收集算法,這種算法的思想是給當(dāng)前不實用的值加上標(biāo)記,然后再回收其內(nèi)存
另一種垃圾收集算法是“引用計數(shù)“,這種算法的思想是跟蹤記錄所有值被引用的次數(shù)。Javascript引擎不淺不再使用這種算法;但在IE中訪問非原聲JavaScript對象(如DOM對象)時,這種算法仍然可能導(dǎo)致問題
當(dāng)代碼中存在循環(huán)引用現(xiàn)象時,“引用技術(shù)”算法就會導(dǎo)致問題
解除變量的引用不僅有助于消除循環(huán)引用現(xiàn)象,而且對垃圾收集也有好處。為了確保有效地回收內(nèi)存,應(yīng)該及時接觸不再使用的全局對象、全局對象屬性以及循環(huán)引用變量的引用
VB中整型一個字節(jié)
這個是2維數(shù)組
第一維從1到10 =10
第二維從0到5 =6
所以占用了 10*6 =60 個字節(jié)
這不是一個可以通過簡單的回答就解決的問題
在javascript的復(fù)雜編程中,很多時候內(nèi)存泄漏導(dǎo)致的ie內(nèi)存不斷增加的問題是不可避免的
原因有:
1,瀏覽器對事件綁定處理、回收機(jī)制的bug,而程序員在編寫程序時沒有注意到所至。
2,閉包方式的拋出的匿名變量(函數(shù))所至
這兩種很多情況下,是很難避免的,特別你在使用jq,extjs,dojo等javascript框架時。
出現(xiàn)這種情況比較復(fù)雜。建議你一段一段模塊的CollectGarbage()測試,在此之前可以拜讀一下。經(jīng)典點關(guān)于javascript/ie內(nèi)存泄漏的文章
對于$("#aaa")的empty(),其實就是循環(huán)remove() "aaa"下的子元素
建議把empty去掉測試一下。問題出在哪
1、當(dāng)頁面中元素被移除或替換時,若元素綁定的事件仍沒被移除,在IE中不會作出恰當(dāng)處理,此時要先手工移除事件,不然會存在內(nèi)存泄露。
2、對于純粹的 ECMAScript 對象而言,只要沒有其他對象引用對象 a、b,也就是說它們只是相互之間的引用,那么仍然會被垃圾收集系統(tǒng)識別并處理。但是,在 Internet Explorer 中,如果循環(huán)引用中的任何對象是 DOM 節(jié)點或者 ActiveX 對象,垃圾收集系統(tǒng)則不會發(fā)現(xiàn)它們之間的循環(huán)關(guān)系與系統(tǒng)中的其他對象是隔離的并釋放它們。最終它們將被保留在內(nèi)存中,直到瀏覽器關(guān)閉。
3、閉包可以維持函數(shù)內(nèi)局部變量,使其得不到釋放。
4、
a?=?{p:?{x:?1}};
b?=?a.p;delete?a.p;
執(zhí)行這段代碼之后b.x的值依然是1.由于已經(jīng)刪除的屬性引用依然存在,因此在JavaScript的某些實現(xiàn)中,可能因為這種不嚴(yán)謹(jǐn)?shù)拇a而造成內(nèi)存泄露。所以在銷毀對象的時候,要遍歷屬性中屬性,依次刪除。
5、一些DOM操作:IE系列的特有問題 簡單的來說就是在向不在DOM樹上的DOM元素appendChild;IE7中,貌似為了改善內(nèi)存泄露,IE7采用了極端的解決方案:離開頁面時回收所有DOM樹上的元素,其它一概不管。
分享題目:javascript內(nèi)存,JavaScript內(nèi)存分配
網(wǎng)頁路徑:http://m.newbst.com/article42/dssgdhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、App設(shè)計、移動網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計、網(wǎng)站制作、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)