JavaScript函数参数传递机制与同名参数处理详解

作者:拾光时间:2026-10-23 16:35:09浏览:608

本文深入解析JavaScript中函数参数的传递机制,区分原始类型的值传递与复合类型的引用传递对原始数据的影响。同时详细阐述同名参数在函数定义中的覆盖规则,即后出现的参数值优先,并介绍利用arguments对象获取被覆盖参数的方法。

本文通过具体实例解析JavaScript中函数参数的传递方式以及同名参数的处理逻辑,供读者参考学习。

函数参数的传递机制

函数参数的传递机制

当函数参数为原始类型值时,采用值传递方式。这意味着在函数内部对参数值的修改,不会反映到函数外部。


var p = 2 
function f(p) {
 p = 3
}
f(p)
p // 2

在上述代码中,变量p属于原始类型值,传入函数f时采用值传递。因此,函数内部的p仅是原始值的副本,无论对其进行何种修改,均不会影响外部的原始值。

然而,若函数参数为复合类型(如对象或数组),则采用引用传递方式。此时传入函数的是该对象的内存地址,因此在函数内部对参数属性的修改会直接影响原始值。


var obj = { p: 1 };

function f(o) {
 o.p = 2;
}
f(obj);

obj.p // 2

在上述代码中,传入函数f的参数obj传递的是其内存地址。因此,在函数内部修改obj的属性p,会同步反映到原始对象上。

需要注意的是,如果在函数内部并非修改参数对象的某个属性,而是直接替换整个参数对象,则不会影响原始值。


var obj = [1, 2, 3];

function f(o) {
 o = [2, 3, 4];
}
f(obj);

obj // [1, 2, 3]

在上述代码中,函数f内部将参数对象obj整体替换为另一个数组。此时原始值不受影响,因为形式参数o原本指向obj的地址,重新赋值使o指向了新地址,原地址上的值保持不变。

函数中的同名参数处理

函数中的同名参数处理

若函数定义中包含同名参数,实际取值时以最后出现的那个参数为准。


function f(a, a) {
 console.log(a);
}

f(1, 2) // 2

在上述代码中,函数f定义了两个同名参数a。在取值时,以后面的a为准,即使后面的a未提供值或被省略,也以其值(或undefined)为准。


function f(a, a) {
 console.log(a);
}

f(1) // undefined

调用函数f时若未提供第二个参数,参数a的值将变为undefined。此时若需获取第一个a的值,可通过arguments对象实现。


function f(a, a) {
 console.log(arguments[0]);
}

f(1) // 1

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

作者最新文章