javaScript高級程序設計--變量和參數的那些事,垃圾回收機制

函數的形參和實參的個數沒有必然的聯繫,因爲函數接收到的永遠是一個數組,可以用arguments對象表示這個數組,arguments是一個類似數組的對象,其長度由傳入的參數的個數決定的;例如:

function hehe(ele1,ele2){
	return arguments[0]
}//就是ele1
JS中的變量

js中的變量的值分爲兩種,一種是包含着基本類型值的變量(5種,因爲在內存中佔用固定大小的空間,所以保存在棧內存中),一種是包含着引用類型值的變量(obj),保存在堆內存中;
變量的複製:
1.當複製的變量是基本類型的值的時候,兩者相互獨立(相當於克隆了一份給了新的變量);
2.當複製的變量是引用類型的值的時候,其實複製的是指針,指向存儲在堆中的同一個對象;
js中的參數的傳遞是按值傳遞的,參數的賦值就和變量的複製是一樣的(無論是引用類型的值還是基本類型的值);基本類型的參數傳遞自然不用多說,但是引用類型的參數傳遞就不好理解了,例如:

var ani = {
	name:"哈士奇"
}
 function changeObj(obje){
 	obje.name = "大金毛"
 	return obje
 }
var aniObj = changeObj(ani);
 alert(aniObj.name);//大金毛
 alert(ani.name)//大金毛
咋一看,好像是參數是按引用傳遞的--因爲當你改變obje對象中的name屬性的時候,也改變了ani對象的name屬性,但是其實不是這樣的,再看一個例子:

 var ani = {
	name:"哈士奇"
}
 function changeObj1(obje){
 	obje = {
 		name:"大金毛"
 	}
 	return obje
 }
var aniObj1 = changeObj1(ani);
 alert(aniObj.name);//大金毛
 alert(ani.name)//哈士奇

在上一例子中,將ani當作參數傳進去changeObj1的函數中,如果說是按引用傳遞的,那麼在函數changeObj1中的參數obje
1和ani的指針指向的是同一個堆中的對象,那麼在函數執行完畢之後,改變了obje的name屬性,那麼必然會引起ani對象name屬性的改變,但是事實卻不是這樣子,所以,函數中的參數是按值傳遞的,也可以認爲是函數中的obje改變了指針的指向,在執行

obje = {
 		name:"大金毛"
 	}

前後obje是不同的對象。

瀏覽器的垃圾回收機制:

收集機制的原理其實很簡單:找出那些不再繼續使用的變量,然後釋放其佔用的內存。爲此, 垃圾收集器會按照固定的時間間隔(或代碼執行中預定的收集時間),週期性地執行這一操作。

垃圾收集策略之標記清除:

目前主流瀏覽器的垃圾回收策略是--標記清除策略,具體的過程是:1.給內存中所有的變量添加標記-->2.清除在環境中有用的變量的標記-->3.代碼執行-->4.給不需要的變量打上標記並回收內存。(還有一種垃圾收集策略是:引用計數,不再贅述)














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章