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函数的参数想象成局部变量,在向参数传递基本类型的值时,被传递的值被复制给一个局部变量。

在向函数传递引用类型时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。

即使在函数内部修改了参数的值,但原始的引用仍然保持未变。

Table of Contents