js中函数参数传递

js中的参数传递是按照参数类型的不同,传递方法不同。如果是基本类型的传递,则传递的是值的副本,形参和实参是两个独立的个体,如果是引用类型的传递,那么传递的是这个值在内存中的地址的副本,局部变量的变化会表现在函数外部。
举例子说明一下:

function addTen(num){
num+=10;
return num;}

var count=20;
var result=addTen(count);
alert(count);//20
alert(result);//30

这里num作为形参,count作为实参,在进行传递的时候,count的值被复制给num,在加十以后,赋给result,因此result的值是30,而count作为一个独立的变量,依然还是20的值没有变。
这里写图片描述

若传递的是对象的话,实参传给形参的是一个地址的复制:

function setName(obj){
obj.name="Nicholas";
}

var person=new Object();
setName(person);
alert(person.name);//Nicholas

在建立变量时,person指向了一个新的内存区域,调用函数时,person将该区域的地址复制给了obj,此时obj和person指向同一块内存区域,这时若是对obj进行操作,就会同时影响到person
这里写图片描述
需要注意的是,并不是所有情况下,对形参的改变都会影响实参,如下代码:

function setName(obj){
obj.name="Nicholas";
obj=new Object();
obj.name="Greg";
}
var person=new Object();
setName(person);
alert(person.name);//Nicholas

当调用setName函数时,将person的地址复制给obj,二者指向同一块内存,obj将其name属性赋值为Nicholas,此时person的name属性也是Nicholas,接下来的

obj=new Object();
obj.name="Greg";

obj指向了一块新的内存,并将其name属性赋值为Greg,但是此时person的name属性并未更改,也就是说,这个时候的obj和person并不是指向同一块内存,同时,在函数结束以后,obj指向的区域也就消失了。类比一下,我们可以认为obj是一个快递员,调用函数的时候,相当于obj按照person家的地址给person送了个name,然后在obj=new Object();的时候,他又给别人送属性去了,和person没有什么关联了。

obj.name=Nicholas
这里写图片描述
obj=new Object();
obj.name=”Greg”;
这里写图片描述

所以函数的参数传递问题,其实质就是 “形参就是函数的局部变量”,以看待局部变量而不是参数的角度去看待它,就容易区分出来值传递和引用传递的区别了,在别的语言中依然通用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值