js中函数的参数传递方式

js中函数的参数传递方式

ECMAScript中所有函数的参数都是按值传递的。
也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。

向参数传递基本类型值
传递一个基本类型值时,被传递的值会被复给一个局部变量(arguments中的一个元素)

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

var count = 20;
var res = add(count);
console.log(count); //20
console.log(res); //30

变量count作为参数传递给函数,在函数内部,参数num被加10,但是这一变化不会影响函数外部的count变量。

向参数传递引用类型值
传递一个引用类型值时,会把这个值在堆内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。

function setName(obj) {
    obj.name = 'hello';
}

var person = new Object();
setName(person);
console.log(person.name);  //  hello

以上代码创建了一个对象,并将其保存在了变量person中,这个对象被传递到了setName函数中被复制给了obj。在函数内部,obj和person引用的是同一个对象,于是在函数内部为obj添加一个name属性后,外部的person也会有所反应,因为person指向的对象在内存中只有一个,而且是全局对象。

但是函数的参数并不是按引用传递的,而是按值传递的。

function setName(obj) {
    obj.name = "hello";
    obj = new Object();
    obj.name = 'world';

}

var person = new Object();
setName(person);
console.log(person.name);  // hello

以上代码中,在把person传递给setName函数后,其name属性被设置为‘hello’。然后,又将一个新的对象赋值给obj,同时将其name设置为‘world’的新对象。但是,接下来再访问person.name时,显示的仍然是‘hello‘,这说明即使在函数内部修改了参数的值,但是原始的引用仍然不变。

实际上,当在函数内部重写obj时,这个变量的引用就是一个局部变量了,而这个局部变量会在函数执行完毕后立即被销毁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值