最近在javaScript讨论中提到了引用的问题,发现很多人都认为在javascript中引用是值传递,当时听着双方说法,想想看觉得都有道理,然后最后看到下面这个例子认为有道理,结果发现其实这个例子是有误的。该文章链接地址如下
点击打开链接
function setAge(obj){
obj.age = 12;
obj = new Object();
obj.age = 15;
}
var person = new Object();
person.age = 13;
setAge(person);
alert(person.age); //显示 12
为什么说这个例子是错误的,其实和当时举的例子有关。如果是值传递,那么大家知道最明显的地方就是函数中传入的参数在函数中如何修改,不会影响传递的参数值。所以得出了上面这个式子中obj在new之后被修改了,但是外边传入的引用却没有变化。从这个方面来看确实和值传递是一样的。但是实际上大家忽略了两者之间的不同。就是“函数“的应用。例子如下图
void test(int* p)
{
p++;
}
void testp(int m)
{
int* t=&m;
}
void main()
{
int a=4;
int* x=&a;
test(x);
testp(a);
}
可以发先int* x=&a;中的x的地址是0x002aab08.然后传入test中p地址也是0x002aab08,但是当p++之后p的地址改变了成为0x002aab0c,而x的地址没有变化。这个说明p和x其实是没有对应关系的。这是因为p是函数定义中的一个参数。只不过这个参数的引用的地址是从外面x中的拷贝过来的。所以当变量对应的地址改变的时候,x不会随之改变(函数定义会给函数参数分配内存空间)。
而如果是值传递,会发现t的地址和x的地址不一样是0x002aaac8。这说明当作为值传递的时候函数的定义的地址是自己声明的,和传递过来的参数的地址是没有关系的。
那么第一个例子其实就已经清楚了,函数定义的时候会给参数分配内存地址。而引用的时候修改了函数参数的地址,值传递的时候只是拷贝了参数值。
而因为参数是函数定义的,所以函数的参数和调用函数时传递的变量只是引用关系,两者之间并不是一个,如果是一个就不需要进行函数声明了。