函數的形參和實參的個數沒有必然的聯繫,因爲函數接收到的永遠是一個數組,可以用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.給不需要的變量打上標記並回收內存。(還有一種垃圾收集策略是:引用計數,不再贅述)