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.给不需要的变量打上标记并回收内存。(还有一种垃圾收集策略是:引用计数,不再赘述)














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