浅谈JavaScript 函数参数传递到底是值传递还是引用

网络编程 2025-03-29 14:05www.168986.cn编程入门

SEO优化长沙网络推广JavaScript函数参数传递的奥秘:值传递还是引用传递?

一直以来,关于JavaScript函数参数传递是值传递还是引用传递的问题,一直困扰着许多开发者。今天,长沙网络推广为大家带来一篇深入浅出的,让我们一起揭开这个谜团。

我们来看一个关于基本类型传递的简单例子:

```javascript

function add(num){

num += 10;

return num;

}

var num = 10;

alert(add(num)); // 输出20

alert(num); // 输出10

```

在这个例子中,按照JavaScript的官方解释,对于基本类型参数传递,函数会创建一个新的栈帧来存储参数值。这意味着函数内部的参数和函数外部的变量拥有相同的值,但占据不同的内存地址。改变函数内部的参数值并不会影响函数外部的变量。上述代码的输出为20和10。

接下来,我们来看一个关于对象引用类型传递的例子:

```javascript

function setName(obj){

obj.name = "ted";

}

var obj = new Object();

setName(obj);

alert(obj.name); // 输出ted

```

在这个例子中,创建了一个对象并将其引用赋给变量obj。在传递函数参数时,同样会创建一个新的栈帧来存储参数值(这里可以理解为对象的引用)。在函数内部,通过修改对象的属性来更改对象的状态。由于函数参数和函数外部变量共享同一个对象的引用,所以函数内部的更改会影响到函数外部的变量。上述代码的输出为“ted”。

那么,有些朋友可能会问,这也可以理解为引用传递呀?其实不是的。在这里,我们严格区分了指针和引用。在类似Java的语言中,已经没有指针的概念。上述过程实际上是一种从符号引用到直接引用的过程。在Java中,引用本身也是一种对象,具有自己的属性和方法。我们无法直接访问和控制引用本身,只能通过引用访问其指向的对象。这种机制避免了内存泄露,被称为内存结构化访问机制。

为了进一步证明上述观点,我们可以稍微改造一下之前的例子:

```javascript

function setName(obj){

obj.name = "ted";

obj = new Object(); // 创建新对象并赋值给函数参数obj

obj.name = "marry"; // 新对象的属性修改不会影响外部变量obj的状态

}

var obj = new Object(); // 外部变量obj的状态不会被改变

setName(obj); // 函数参数obj和外部变量obj指向不同的对象实例

alert(obj.name); // 输出仍然是"ted",因为外部变量obj的状态未被改变。

```

这个例子中的函数参数obj和原有的外部变量obj指向的是不同的对象实例。函数内部的更改不会影响到函数外部的变量。这也进一步证明了JavaScript中的参数传递是值传递而非引用传递。希望这篇文章能帮助大家更好地理解JavaScript的函数参数传递机制。感谢大家的支持!如果您有任何疑问或建议,请随时联系狼蚁SEO团队。请允许我使用Cambrian的代码渲染工具结束这篇文章。感谢您的阅读!

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by