Bezieht sich der Funktionsname von js auf den Speicher, da er ein Zeiger auf das Funktionsobjekt ist?
`
var a=function(c){
return ++c;
}
console.log(a(1));
var b=a;
console.log(b(1));
var a=null;
console.log(b);
console.log(b(1));
` , also wie führt man eine manuelle Zerst?rung durch? Müssen globale Variablen geschlossen werden, bevor der Browser recycelt wird? Vielen Dank für die L?sung
首先var a
會在stack
里面開一塊空間,然后你將他賦給一個function
,是一個引用類型,于是又在heap
里面又申請一塊空間存放function
,此時,stack
里面的a
存放的是function
的地址
而下面,將b
賦值給a
,是將stack
里面a
指向的heap
里面function
的地址賦給b
,所以這就是為什么后來a
指向了null
,但是b
仍然指向之前heap
里面function
的原因。
如何銷毀?將b
也設(shè)置為null
或者其他值就好了。所以這種變量盡量不要寫全局的,寫局部變量。
是不是引用內(nèi)存? 這問題有點太寬了, 數(shù)據(jù)都是放在內(nèi)存里的, 自然需要引用內(nèi)存
但又不止引用內(nèi)存那么簡單, 內(nèi)存只負責存數(shù)據(jù), 數(shù)據(jù)間的關(guān)系是沒法體現(xiàn)的, 所以不是直接引用內(nèi)存
中間是有隱藏處理的, 怎么操作有基本的理論, 但實際上很少人知道具體的細節(jié), 太底層了
另外, 回收的話有兩種做法:
1, 設(shè)置null, 等待自動清空
a = null;
會在回收程序執(zhí)行的時候自動清空
2, 立刻清空
delete a;
直接執(zhí)行回收
但老ie并不支持這種操作
一般直接用方法1就行, 不必擔心會溢出, 自動回收會有多種觸發(fā), 比如定時, 比如數(shù)據(jù)達到一定量
// 那么在最后應該將 op 解除引用來避免內(nèi)存泄漏。
// 所謂的內(nèi)存泄露,就是被分配的內(nèi)存既不能被使用,也不能夠被回收的一個現(xiàn)象。
// 低版本的IE瀏覽器中,DOM對象與javascript對象形成循環(huán)引用,
// 那么就有可能產(chǎn)生內(nèi)存泄露,除非人為的切斷引用。
function box() {
var op = document.getElementById('op');
var text = op.innerHTML;
op.onclick = function () {
alert(text);
};
op = null; //解除引用
}
box();
// 節(jié)省內(nèi)存
// PS:如果并沒有使用解除引用,那么需要等到瀏覽器關(guān)閉才得以釋放。
關(guān)于垃圾回收機制:
在IE舊版本下,DOM是COM對象的形式,采用引用次數(shù)計數(shù)清除,如果有循環(huán)引用的情況,那么就一直都不會得到釋放內(nèi)存的機會。
在標準瀏覽器中是標記清除的方法,只需要手動解除將引用設(shè)置為null就可以釋放內(nèi)存了。
如果沒有解除引用,那么會到離開執(zhí)行環(huán)境時才釋放內(nèi)存,而全局的變量對象也就得等到全局執(zhí)行環(huán)境退出時才會釋放這部分的內(nèi)存,即關(guān)閉瀏覽器時才會釋放。