title: 前端开发系列118-进阶篇之Call by sharing(值传递还是引用传递)
tags:
categories: []
date: 2019-04-14 22:05:13
JavaScript 语言中,函数调用时候参数的传递是"值传递"还是"引用传递" ?
在 JavaScript 语言中 ,函数参数传递的是「值」
而非「引用」
,即我们使用的是值传递
的方式,关于这一点,我们可以通过下面这段简短的代码来进行说明。
/* 1、变量声明 */
let x = 100;
/* 2、函数声明 */
function changeX(x) {
x = 200;
}
/* 3、函数调用 */
changeX(x);
/* 4、打印输出 */
console.log(`x = ${x}`); /* x = 100 */
/* +++++++++++++= */
/* 测试代码-A */
let o1 = { name: "Yong" };
function change_A(o1) {
/* 注解:此处的o1为函数内部的局部参数(临时变量) */
o1.name = "Xia"
}
change_A(o1);
console.log(`o = `, o1); /* o1 = { name: 'Xia' } */
/* 测试代码-B */
let o2 = { name: "Yong" };
function change_B(o2) {
/* 注解:此处的o2为函数内部的局部参数(临时变量) */
o2 = { age: 18 };
}
change_B(o2);
console.log(`o = `, o2); /* o = { name: 'Yong' } */
在上面的代码中,有几个点需要进行说明。在 changeX() change_A() change_B()
中的x | o1 | o2
这三个变量用的都是形参,也就是说函数内部的这三个变量都是局部变量,它们区别于外部的全局变量是临时的。当函数调用时通过 实参 ——> 形参
来创建和赋值,函数执行完后这些局部变量就会被销毁。
函数调用时候都做了些什么?
[1] 把实参的值赋值给形参,相当于在函数中执行下面的代码
let x = x; <!-- 把 x 这个变量保存的内容(数字-100)拷贝一份给左边变量存储 -->
let o1 = o1; <!-- 把 o1 这个变量保存的内容(指针-对象)拷贝一份给左边变量存储 -->
let o2 = o2; <!-- 把 o2 这个变量保存的内容(指针-对象)拷贝一份给左边变量存储 -->
[2] 执行函数体中的代码
通过/* 测试代码-A */
和/* 测试代码-B */
的对比,我们可以知道JavaScript 函数是值传递的
,如果 JavaScript 函数是引用传递的
,那么/* 测试代码-B */
执行后打印的结果应该是o = { age: 18 }
。