JS函数的按值传递

40 篇文章 2 订阅
27 篇文章 0 订阅

写在前面:ECMAScript访问变量有按值按引用2中方式,那函数的传参呢?是按值传递还是按引用传递?之前有专门介绍:javascript中的引用类型 和 普通类型


在向参数传递 基本类型 的值时,被传递的值会被赋给一个局部变量(即命名参数/arguments对象中的一个元素):

//demo1:

function add(n) {
    return n += 100;
}

var _count = 100;
var result = add(_count);
console.log(result);    //200
console.log(_count);    //100 
//_count没有变化,因为是值传递,内部的变化不会反映到函数外部。

一切都向我们预想中的方向发展了,

但是~~在向参数传递 引用类型 的值时:

//demo2:

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

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

参数传递不是按值传递的吗?为什么内部 obj 的变化,会反映到外部的 person 对象上?
~
~
~
在向参数传递 ‘‘引用类型’’ 的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。

以上代码创建的一个对象并保留在一个变量person中。然后,person在执行setName()函数时被复制给了p,在这个函数内部,pperson引用的是同一个对象。

换句话说,即使变量person是按值传递的,p也会按引用来访问同一个对象。

所以,当执行p.name = 'hello',外部的person.name => hello,因为person所指向的对象在堆内存中只有一个,而且是全局对象。

这里有一个很大的误区:在局部作用域中修改的对象会在全局作用域反映出来,就说明参数是按照引用传递的,这个是错误的。。。举个栗子:

demo2中的代码修改为demo3

//demo3:

function setName(p) {
      p.name = 'hello';
      p = new Object();
      p.name = 'world';
}

var person = new Object();
setName(person);
alert(person.name);     //输出仍然是 hello

~~~
上面的例子很好的解释了函数参数的按值传递

即使在函数内部修改了p的值,但是原始的引用依然保持不变的。

当在函数内部重写p的时候,这个变量的引用就是一个局部对象了。而,这个局部对象,会在函数执行完毕后自动销毁。

再来看个例子demo4

//demo4:

function setName(p) {
    p = {
        name : 'world'
    }
    p.name = 'hello';
}

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

demo4输出undefined,对比demo3应该比较容易理解,p在函数内部被重写了,这个时候变量引用的就是一个局部对象,这个局部对象会在函数执行完毕后自动销毁。

小结:ECMAScript中所有函数的参数都是按值传递的~~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值