JS函数传参
var count = 10;
function num(num1){
num1 = 1;
return num1;
}
var result = num(count);
console.log(result);//1
console.log(count);//10,并未变成1
函数传参和变量复制是一样的,上例为基本类型的函数传参(也就相当于基本类型的变量复制),count复制给num1一份,函数内部修改了num1,但并不会影响外边count的值。复制后的两个值不会有联系。一个变不会影响另一个。
var person = {
name : "Tom"
};
function obj(peo){
peo.name = "Jerry";
return peo;
}
var result = obj(person);
console.log(result.name);// Jerry
console.log(person.name);// Jerry
上例为引用类型传参,也就相当于引用类型的复制,person复制给了peo,在函数内部修改了peo,引用类型的复制,一个修改会影响另一个的值,所以person.name也变了。
var person = {
name : "Tom"
};
function obj(peo){
peo = {
name : "Jerry"
};
return peo;
}
var result = obj(person);
console.log(result.name);// Jerry
console.log(person.name);// Tom
上例中,person传递给函数中的peo,但在函数内部peo又指向了一个新对象,所以result.name是新对象的值,person还是指向原对象,所以并没有改变。
var fn1 = function(){
console.log("1111");
}
var fn2 = function(){
console.log("2222");
}
var fn = function(f){
f();
f = fn2;
}
fn(fn1); //1111
fn1(); //1111
这个同上例,f在函数内部改变了指向,但并不影响fn1的指向。fn1还是原来的函数。
ECMAScript中所有函数的参数都是按值传递的。 ——《JS高程》
我们可以把ECMAScript函数的参数想象成局部变量,在向参数传递基本类型的值时,被传递的值被复制给一个局部变量。
在向函数传递引用类型时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
即使在函数内部修改了参数的值,但原始的引用仍然保持未变。