es中所有函数的参数都是按值传递。
基本类型值的传递和基本类型变量复制一样,引用类型传递如同引用类型变量的复制一样。
在向参数传递基本类型的值的时候,被传递的值会被复制给一个局部变量,也就是我们的arguments;
function add(num){
num += 10;
return num;
}
var count = 20;
var result = add(count);
alert(count);//20
alert(result);//30
函数add的参数num是函数内部的局部变量,变量count的值20被复制给参数num,num和count没有任何关联,仅仅只是值相同。
在向参数传递引用类型的值的时候,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
function setName(obj){
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name);//Nicholas
变量person里面保存了新创建的对象,调用函数的时候,person被传递到setName之后就被复制给了obj。obj和person引用的是同一个对象。即使这个变量是按值传递的,obj也会按引用来访问同一个对象,person指向的对象在堆内存中只有一个,而且是全局对象。
function setName(obj){
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
我在控制台运行了这段代码,是弹出了"Nicholas"。
如果person是按引用传递的,那么person就会自动被修改为指向其name为"Greg"的新对象。实际上当在函数内部重写obj时,这个变量引用的就是一个局部对象。
函数内部 obj = new Object();是把这个局部变量指向了新的对象,然后赋值"Greg",是这个意思吧。
上面是<JavaScript高级程序设计>说的,我其实还是有点不明白,那句“即使这个变量是按值传递的,obj也会按引用来访问同一个对象”是什么意思。