函数的形参和实参的个数没有必然的联系,因为函数接收到的永远是一个数组,可以用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.给不需要的变量打上标记并回收内存。(还有一种垃圾收集策略是:引用计数,不再赘述)