js中所有的函数都是按值传递的。
在向参数传递基本类型时,被传递的值会被复制给一个局部变量。
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count); //20,没有变化
alert(result); //30
count传递给参数num,函数内部num做了修改,但是没有反映到count上。
function setName(obj){
obj.name = "Jack";
}
var person = new Object();
setName(person);
alert(person.name); //Jack
这个例子很容易让人觉得,引用类型做为函数参数传递是按引用传递的,因为局部的修改:obj.name = "Jack",反映在了全局的作用域上:person.name,事实上并不是如此。
事实上:我们创建了一个对象,并把它保存在person变量中,然后把person当做参数传递到setName()函数中复制给了obj,在这个函数内部obj和person引用的是同一个对象。
再看一个例子:
function setName(obj){
obj.name = "Jack";
obj = new Object();
obj.name = "Rose";
}
var person = new Object();
setName(person);
alert(person.name); //Jack
这个例子中在setName()函数中,为obj重新定义了一个对象,另一行代码为该对象定义了一个带有不同值的name属性。如果person传递给函数setName()之后是按引用传递的,那么对obj.name的修改就会反映到person.name上,事实上person.name依然是Jack。