Skip to content

JS 中的参数传递

结论:JavaScript 中所有函数的参数都是按值传递的

案例

javascript
//基本数据类型,无疑是使用值传递
function addTen(num) {
  num += 10;
  return num;
}
let count = 20;
let result = addTen(count);
console.log(count); // 20,没有变化
console.log(result); // 30

//再看此案例,有可能会错误的认为,此处就是引用传递
//但是事实其实是此处依然是值传递,obj只是保存了指向堆中的地址
//此处改变完全是因为person被赋值给obj,obj 保存的地址指向的对象保存在全局作用域的堆内存上
function setName(obj) {
  obj.name = 'Nicholas';
}
let person = new Object();
setName(person);
console.log(person.name); // "Nicholas"

//再看下方这个案例
//如果 person 是按引用传递的,那么 person 应该自动将指针改为指向 name 为"Greg"的对象。
//可是,当我们再次访问 person.name 时,它的值是"Nicholas",这表明函数中参数的值改变之后,原始的引用仍然没变。
//当 obj 在函数内部被重写时,它变成了一个指向本地对象的指针(也就是保存的原地址被切断,指向新地址)。而那个本地对象在函数执行结束时就被销毁了。
function setName(obj) {
  obj.name = 'Nicholas';
  obj = new Object();
  obj.name = 'Greg';
}
let person = new Object();
setName(person);
console.log(person.name); // "Nicholas"

注意 ECMAScript 中函数的参数就是局部变量

Keep Reading, Keep Writing, Keep Coding