JavaScript - 函数参数
函数参数和实参
JavaScript 中的 function parameters(函数参数)是在函数定义中括号内列出的变量。函数可以有多个用逗号分隔的参数。function arguments(函数实参)是在调用函数时传递给函数的值。我们通过列出参数来定义函数,并通过传递实参来调用函数。
传递给函数的实参数量必须与函数定义中的参数数量匹配。如果不匹配,可能会得到意外的结果。
语法
在 JavaScript 中使用 function parameters 的语法如下 −
function functionName (parameter1, parameter2, parameter3) {
//语句
}
在上述语法中,函数参数是 'parameter1'、'parameter2' 和 'parameter3'。
参数规则
JavaScript 函数在调用时不会检查传递的实参数量。
无需指定函数参数的数据类型。
JavaScript 编译器不会对传递的函数实参进行类型检查。
JavaScript 的 function arguments(函数实参)是在调用函数时传递给函数的变量或值。
functionName (10, b, 'Hello');
在上述语法中,第一个实参是 number 数据类型,第三个是 string 数据类型。第二个实参是之前在代码中定义的变量。
示例:函数参数和实参
在下面的代码中,mult() 函数接受 4 个参数。可以观察到参数的类型没有定义。我们在函数体中将参数值相乘并返回结果值。
在调用函数时,我们传递了 4 个数字值作为函数实参。用户可以观察函数针对不同函数实参的输出。
<html>
<body>
<p id = "output"> </p>
<script>
function mult(a, b, c) {
let res = a * b * c;
return res;
}
let ans = mult(2, 3, 4);
document.getElementById("output").innerHTML =
"2、3 和 4 的乘积是 " + ans;
</script>
</body>
</html>
输出
2、3 和 4 的乘积是 24
arguments 对象
在 JavaScript 中,每个函数都有一个 'arguments' 对象。它以数组的形式包含调用函数时传递的所有实参。我们可以遍历该数组并获取每个实参,即使函数没有指定参数。
示例
在下面的示例中,函数定义不包含任何参数,但我们在调用函数时传递了 4 个实参。因此,我们在函数体内使用循环遍历 arguments[] 数组来逐一访问所有实参。
在函数体内,我们将所有实参合并并返回 'final' 字符串。
<html>
<body>
<p id = "output"> </p>
<script>
function merge() {
let final = "";
for (let p = 0; p < arguments.length; p++) {
final += arguments[p] + " ";
}
return final;
}
let ans = merge("Hi", "I", "am", "John!");
document.getElementById("output").innerHTML =
"合并后的字符串是: " + ans;
</script>
</body>
</html>
输出
合并后的字符串是: Hi I am John!
按值传递参数
在函数中,当你按值传递参数到函数调用时,它会将参数值发送到函数定义的参数中。因此,当你更新函数参数时,函数参数的值不会发生变化。
示例
在下面的代码中,我们在函数外部定义了 'val1' 和 'val2' 变量,并将它们作为函数参数传递。
在函数体中,我们更改了参数值。在输出中,你可以看到即使更新了参数值,'val1' 和 'val2' 的实际值也没有改变。
<html>
<head>
<title> JavaScript - Arguments are passed by value </title>
</head>
<body>
<p id = "output"> </p>
<script>
const output = document.getElementById("output");
function update(val1, val2) {
val1 = 20;
val2 = 30;
}
var val1 = "Hello";
var val2 = "World";
output.innerHTML += "Before calling the function! <br>";
output.innerHTML += "val1 = " + val1 + ", val2 = " + val2 + "<br>";
update(val1, val2);
output.innerHTML += "After calling the function! <br>";
output.innerHTML += "val1 = " + val1 + ", val2 = " + val2 + "<br>";
</script>
</body>
</html>
输出
Before calling the function! val1 = Hello, val2 = World After calling the function! val1 = Hello, val2 = World
按引用传递参数
当你将对象作为参数传递时,函数会将对象的地址作为参数发送到函数定义中。因此,这被称为按引用传递参数。
在函数体中,如果你更改对象的属性,它也会反映到函数外部。
示例
在下面的代码中,我们将 'obj' 对象作为函数参数传递。在函数体中,我们更改了对象 'domain' 属性的值。
在输出中,你可以观察到即使在函数外部调用函数后,'domain' 属性的值也发生了变化,因为对象是按引用传递的。
<html>
<head>
<title> JavaScript - Arguments are passed by reference </title>
</head>
<body>
<p id = "output"> </p>
<script>
const output = document.getElementById("output");
function update(obj) {
obj.domain = "www.example.com";
}
var obj = {
domain: "www.google.com",
}
output.innerHTML += "Before calling the function! <br>";
output.innerHTML += "domain = " + obj.domain + "<br>";
update(obj);
output.innerHTML += "After calling the function! <br>";
output.innerHTML += "domain = " + obj.domain + "<br>";
</script>
</body>
</html>
输出
Before calling the function! domain = www.google.com After calling the function! domain = www.example.com