javascript - js 函數的一點小問題求解
为情所困
为情所困 2017-05-19 10:26:59
0
5
529

js的函數名稱既然是函數物件的指針,那麼是引用的是記憶體嗎?
`

        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));

` ,那麼如何做手動銷毀呢?全域變數是不是需要關閉瀏覽器才會回收?求解謝謝

为情所困
为情所困

全部回覆(5)
迷茫

首先var a会在stack里面开一块空间,然后你将他赋给一个function,是一个引用类型,于是又在heap里面又申请一块空间存放function,此时,stack里面的a存放的是function的地址

而下面,將b赋值给a,是将stack里面a指向的heap里面function的地址赋给b,所以这就是为什么后来a指向了null,但是b仍然指向之前heap里面function的原因。

如何銷毀?將b也设置为null或其他數值就好了。所以這種變數盡量不要寫全域的,寫局部變數。

滿天的星座

是不是引用內存? 這問題有點太寬了, 數據都是放在內存裡的, 自然需要引用內存
但又不止引用內存那麼簡單, 內存只負責存數據, 數據間的關係是沒法體現的, 所以不是直接引用內存
中間是有隱藏處理的, 怎麼操作有基本的理論, 但實際上很少人知道具體的細節, 太底層了

另外, 回收的話有兩種做法:

1, 设置null, 等待自动清空
a = null;
会在回收程序执行的时候自动清空
2, 立刻清空
delete a;
直接执行回收
但老ie并不支持这种操作

一般直接用方法1就行, 不必擔心會溢出, 自動回收會有多種觸發, 例如定時, 例如數據達到一定量

伊谢尔伦

雷雷

漂亮男人

js用delete可以手動回收變數

黄舟

關於垃圾回收機制:
在IE舊版本下,DOM是COM對象的形式,採用引用次數計數清除,如果有循環引用的情況,那麼就一直都不會得到釋放內存的機會。
在標準瀏覽器中是標記清除的方法,只需要手動解除將引用設置為null就可以釋放內存了。

如果沒有解除引用,那麼會到離開執行環境時才釋放內存,而全局的變量對像也就得等到全局執行環境退出時才會釋放這部分的內存,即關閉瀏覽器時才會釋放。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板