首页 > 代码库 > js中函数传递参数,究竟是值传递还是引用传递?

js中函数传递参数,究竟是值传递还是引用传递?


记住真理: js函数传递参数,不管是简单数据类型,还是引用数据类型,都是值传递!!

下面是js红包书里面的例子:
  1. function setName(obj) {
  2. obj.name = "Nicholas";
  3. obj = new Object();
  4. obj.name = "Greg";
  5. }
  6. var person = new Object();
  7. setName(person);
  8. alert(person.name); // "Nicholas"

肯定有人会问了,既然是值传递,那么我对setName这个函数传递了person对象,在函数里面对person对象进行修改,为什么会对全局的person 产生影响呢?

首先,我们要清楚,person 这个变量,是指向堆内存中一个对象的地址,这点要铭记!所以,它值传递复制给函数参数的,就是指向堆内存中那个对象的地址这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象呀。

请看图:
技术分享
如果是引用传递,第二格中的内容整个传递进去,就不会有第四格的存在了,也就是说,如果是引用传递,person 函数的参数是对person 变量的一个引用,那么堆内存中 那个对象只有一个引用地址;

事实是值传递,person 函数的参数复制了一份对堆内存中那个对象的地址,堆内存中 那个对象有两个引用地址;如果我在函数内部,对该参数进行了修改,实际上是对堆内存中的那个对象进行了修改;

再看这道题:
  1. var b = {b:1};
  2. function addB(b){
  3. b.b++; // 函数形参b是指向堆内存中的那个对象,被修改了
  4. b={}; // 函数形参b被指向另外一个空对象,堆内存中的那个对象只有全局的b 还在引用
  5. b.b=3; // 函数形参b引用的空对象被修改,同时在这一行代码执行完后,被销毁
  6. }
  7. addB(b); // b变量对堆内存中对象的引用地址,被复制了一份,赋值到函数形参上
  8. console.log(b.b);




null


js中函数传递参数,究竟是值传递还是引用传递?