JavaScript中的所有参数传递的都是值传递?

ECMAScript中所有函数的参数都是按值传递的

也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。基本类型值的传递如同基本类型变量的复制一样,而 引用类型值的传递,则如同引用类型变量的复制一样。有不少开发人员在这一点上可能会感到困惑,因 为访问变量有按值和按引用两种方式,而参数只能按值传递。


值传递,两个变量可以做任何操作而不会相互影响


引用传递,复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量



在向参数传递基本类型的值时, 被传递的值会被复制给一个局部变最(即命名参数, 或者用ECMAScript的概念来说,就是arguments对象中的一个元素)。

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



这里的函数 addTen{}有一个参数nurn,而参数实际上是函数的局部变量。在调用这个函数时,变量count作为参数被传递给函数.这个变量的值是20。于是,数值20被复制给参数num以便在addTen{}中使用。在函数内部, 参数num的值被加上了10,但这一变化不会影响函数外部的count变量。参数num与变量count互不相识,它们仅仅是具有相同的值。假如num是按引用传递的话,那么变量count的值也将变成30,从而反映函数内部的修改。当然,使用数值等基本类型值来说明按值传递参数比较筒单,

但如果使用对象,那问题就不怎么好理解了。再举一个例子:


以上代码中创建一个对象,并将其保存在了变量person中。然后,这个对象被传递到setName() 函数中之后就被复制给了obj。在这个函数内部,obj和person引用的是同一个对象。换句话说,即使这个对象是按值传递的,obj也会按引用来访问同一个对象。于是,当在西数内部为obj添加name属性后,函数外部的person也将有所反映;因为 person指向的对象在堆内存中只有一个,而且是全局对象。有很多开发人员错误地认为:在局部作用域中修改的对象会在全局作用域中反映出来, 就说明参数是按引用传递的。为了证明对象是按值传递的,我们再看一看下面这个经过修改的例子:


    这个例子与前一个例子的唯一区别.就是在setName()函数中添加了两行代码: 一行代码为obj 重新定义了一个对象,另一行代码为该对象定义了一个带有不同值的name属性。在把person传递给 setName ( ), 其name属性被设置为”Nicholas ” 。然后,又将一个新对象赋给变量obj ,同时将其name 属性设置为Greg 。如果person是按引用传递的,那么person就会自动被修改为 指向其name属性值为 "Greg"的新对象。但是,当接下来再访问person.name时,显示的值仍然是”Nicholas ” 。这说明即使在函数内部修改了参数的值,但原始的引用仍然保持未变。实际上, 当在函数内部重写obj时. 这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。

可以把EcmaScript函数的参数想象成局部变量



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值