JavaScript基础——函数参数 值传递和引用传递

111 阅读1分钟

ECMAScript 中的所有参数传递的都是值,不可能通过引用传递参数。

不少人对参数都是按值传递的感到困惑,因为访问变量有按值和按引用两种方式。

按值传递

function add(num) {
    num += 1;
    return num;
}

var count = 20;
var result = add(count);  //按值传递 num = count
alert(count);  // 20, 没变化
alert(result);  // 21

按值传递传递完后两个变量互不相干

按引用传递

function sayName(obj) {
    obj.name = 'Jack';
}

var person = new Object();
sayName(person);
console.log(person.name);   // Jack

var person = new Object() 时,可以用下图表示变量和对象的关系

当调用函数 setName(person)时,下图可以表示全局变量person和局部变量obj的关心:

在上述例子中 sayName 函数的参数虽然感觉是引用传递,但事实上,该函数参数还是按值传递,传递的是 obj 的内存地址。

在将上述例子修改

function sayName(obj) {
    obj.name = "Jack";
    obj = new Object(); //改变obj的指向,此时obj指向一个新的内存地址,不再和person指向同一
    obj.name = "Greg";
}

var person = new Object();
sayName(person);
console.log(person.name);  //"Jack"

当创建obj对象 obj = new Object(); 时,来看看这时person和obj的关系图:

综上所述:对象引用本身就是传递引用地址,重新初始化变量会改变引用地址,也不会更改原变量。