JS基础总结 - 函数参数的传递
ECMAScript 中所有函数的参数都是按值传递的。
也就是说,把函数外部的值复制给函数内部的参数(值从一个变量复制到另一个变量一样)。
代码验证
向参数传递基本类型
function addTen(num) {
num += 10;
}
var count = 20;
addTen(count);
alert(count); //20,没有变化; 如果是按引用传递的会变成 30
向参数传递引用类型
function setName(obj) {
obj.name = "Nicholas";
obj = new Object(); // **重点:如果按引用传递,外部参数会被重新赋值。
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas" ; 如果是按引用传递的会变成 "Greg"
代码解读:
- 外部变量
person
对象的地址值,复制给内部参数obj
(值传递),而不是“直接引用该地址值”(引用传递) - 修改 obj.name = "Nicholas" // 因为
obj
复制了person
的地址,所以person.name
变成了"Nicholas" - obj = new Object(); // 内部参数
obj
重新赋值,指向新的对象。 - obj.name = "Greg"; // 因为内部参数
obj
不再指向person
的地址,所以person.name
任然为"Nicholas"
总结
简单地说(个人理解),
按值传递参数就是,在函数内部,新建一个变量,复制传入的参数。
按引用传递就是,函数内部的形参,直接引用这个实参。对形参的任何修改,就是直接在这个实参上的修改。
参考
《JavaScript高级程序设计》.第3版 4.1.3 传递参数