在js中传递参数都是按值传递的。
例一:
function addTen(num){
num+=10;
return num;
}
var count=20;
var result=addTen(count);
alert(count); //20 没有变化
alert(result); //30
对于基本数据类型count 将值复制给参数num。以便在函数内部使用, 此时在内存栈中同时有两块内存分别为count和num,而且两块内存没有任何关系,只是两块内存中的值都是20; num加上10变为30,而count却不会产生变化。相信上面的大家都懂。 但是对于引用类型情况又是怎么样的呢?
例二:
function setName(obj){
obj.name="yuanfang";
}
var person = new Object();
setName(person);
alert(person.name); //yuanfang
此时创建了一个对象并将值放在了person变量中。这个对象被传递到setName函数之后就复制给了obj。在函数内部obj和person引用的是同一对象所以说当函数内部的obj的属性发生变化时肯定会反映到person,此时貌似解释为按引用传递也是行得通的。请看下面:
例三:
function setName(obj){
obj.name="yuanfang";
obj = new Object();
obj.name="yuanfang1";
}
var person = new Object();
setName(person);
alert(person.name) // yuanfang
如果是引用传值的话obj和person指向同一个对象,当执行到obj.name="yuanfang"时,此时person.name="yuanfang"。 引用本质上就是别名;将一个新的对象赋予obj并且属性name变为"yuanfang1"。那么person也将随之改变。但是我们看到结果却是"yuanfang"。实际上当在函数内重写obj时,这个变量引用就是一个局部对象了。而这个局部对象将在函数执行完毕后立即被销毁。