JavaScript中函数参数的传递

本文深入解析JavaScript中函数参数的传递机制,重点阐述基本类型与引用类型的传递差异,并通过实例展示如何影响外部变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

js高级程序设计》上是这样叙述参数传递的:所有函数的参数都是按值传递的,也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。

我们现在来看个面试题:

var a = 1;
var obj = {
   b: 2
};
var fn = function () {};
fn.c = 3;
function test(x, y, z) {
    x = 4;
    y.b = 5;----------(1)
    z.c = 6;
    return z;
}
test(a, obj, fn);
alert(a + obj.b + fn.c);

    首先test传递进去的实参中,a是基本类型。在执行test的时候,x被赋值为4。这个例子很容易理解,实际就是创建了一个a的副本,然后把a的值传入参数中,因为函数中定义了参数的值,所以4就将1覆盖了,但a的值并未发生变化。
obj和 fn都是引用类型。
    在上面的例子中,把obj作为参数传入test()中,就有了地址副本,此时obj和y指向了同一个对象,而在y中修改了b属性,其实修改了它们共同指向的对象的b属性,相对应的外部obj所引用的b属性也就改变了。fn同理。所以alert的结果应该是1+5+6 =12.
不过如果(1) 改成y={b:5},那么情况就不一样了。此时我们为y赋了值,也就是说我们把地址副本的指向改变了,指向了新的对象。这样内部的y和外部的 obj就完全没关系了。所以alert的结果应该是1+2+6 =9.

结论:

1、对于数字、字符串等是将它们的值传递给了函数参数,函数参数的改变不会影响函数外部的变量。
2、对于数组和对象等是将对象(数组)的变量的值传递给了函数参数,这个变量保存的指向对象(数组)的地址。当函数改变这个地址指向的对象(数组)的内容时,同时也改变了函数外部变量指向的对象(数组)的内容;当函数改变的是变量的地址时,实际就与函数外部的变量失去了联系,变成了完全不同的对象了,不会对函数外部对象造成改变。

参考资料:

js函数中参数的传递

JavaScript的赋值是引用or复制,及参数传递

JavaScript中函数参数的值传递和引用传递



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值