定义并使用函数
学习如何在 JavaScript 中将程序划分为函数或子程序。
函数
在 JavaScript 中,我们可以将程序划分为称为函数的程序化组件或模块。我们已经熟悉像 console.log()、prompt() 这样的函数,以及像数组的 length 这样的属性。通过一种称为模块化或过程式方法的技术,函数可以被复制和重用,这也被称为“分而治之”方法。我们应该始终尝试设计可以在其他程序中复用的函数。
总体上,函数分为两种类型,我们将在接下来的部分中进行探讨。
函数的结构
以下幻灯片展示了函数定义的各个部分:
函数名只能包含字母(A–Z 和 a–z)以及下划线符号(_)。也可以包含数字(0–9),但函数名不能以数字开头。例如,
Key_2是一个有效的函数名,但2_key不是。函数名区分大小写,这意味着name、Name和NAME是三个不同的函数。
函数定义主要有两个部分:
- 头部:第一行,包含一对括号。
- 主体:位于函数边界内的语句块。
函数头部包含 function 关键字(由语言预定义的关键字)、函数名 sayHello、括号中的参数 ( ),以及一对花括号用于表示主体的开始和结束。函数主体中的所有语句都必须用 { 和 } 包裹成一个代码块。我们不能在没有花括号的情况下编写函数主体。
让我们写出上面示例的代码。
No configuration found for ID: 90401f1cffd3945482d0c5f24695502dd25f34270b5b5011fb07b91cf4d467f2
在最后一行,我们告诉程序运行函数 sayHello()。这一行被称为函数调用或调用函数。
函数调用示例
让我们看下面这段代码:
No configuration found for ID: 46a1fce2993ebddc6958ad5f5e7ae76270cc58138667685399714ae75e8da2c2
在程序中:
- 我们定义了两个简单的函数 ——
first和second。 - 我们借助
console.log语句演示了执行顺序。
return 语句
以下幻灯片展示了一个返回值的函数。该示例说明了(1)如何在函数主体中使用 return 语句,以及(2)如何在函数头部书写参数 (a, b)。
让我们写出上述示例的代码。
No configuration found for ID: 4f32b23b5361db822bb2fefef34380215d8857e2814c838fc8fa682acb105f4d
在上述代码中:
- 最后一行调用了
console.log()函数。它以5和6作为参数a和b的值,调用getSum()函数。 - 变量
mysum存储了a和b的和,结果为11。 - 语句
return mysum;将11作为函数调用的结果返回给console.log()语句。
注意:在
return语句之后编写的任何函数体中的语句都是不可达的。
练习:创建并调用函数
以下是几个用于练习创建和调用函数的示例程序。你会在下方看到解决相应问题的程序。你可以将给出的解决方案复制粘贴到代码编辑器中,以确保你的输出与提供的答案一致。编程中可能存在多种正确的解决方案。
创建乘法表的函数
编写一个函数 showTableOf4(),用于显示 4 的 20 项乘法表。调用该函数以显示结果。
示例输出
14 x 1 = 4 24 x 2 = 8 34 x 3 = 12 44 x 4 = 16 54 x 5 = 20 64 x 6 = 24 74 x 7 = 28 84 x 8 = 32 94 x 9 = 36 104 x 10 = 40 114 x 11 = 44 124 x 12 = 48 134 x 13 = 52 144 x 14 = 56 154 x 15 = 60 164 x 16 = 64 174 x 17 = 68 184 x 18 = 72 194 x 19 = 76 204 x 20 = 80
No configuration found for ID: c5fab49739dd8a02b907f81f5151f106e3a8df7e3c486c128b1733e603f242ae
你可以在上方的代码编辑器中运行以下代码:
1function showTableOf4() { 2 for (let i = 1; i < 21; i++) { 3 console.log('4 x ' + i + ' = ' + (4 * i)); 4 } 5} 6 7showTableOf4();
在上述程序中:
- 我们实现了一个函数
showTableOf4()。 - 在函数体内,我们使用
for (let i = 1; i < 21; i++)循环来显示乘法表。 - 循环体结束后,我们调用
showTableOf4()函数来显示4的乘法表。
你可以在上方的代码编辑器中运行以下代码:
1function showTableOf4() { 2 for (let i = 1; i < 21; i++) { 3 console.log('4 x ' + i + ' = ' + (4 * i)); 4 } 5} 6showTableOf4();
在上述程序中:
-
我们实现了一个函数
showTableOf4()。 -
在函数体内,我们使用
for (let i = 1; i < 21; i++)循环来显示乘法表。 -
循环体结束后,我们调用函数
showTableOf4()来显示4的乘法表。
查找唯一值的函数
编写一个函数 showDistinct,接收一个数组作为参数,并打印出数组中的唯一元素。假设数组已按升序排列。调用该函数以显示结果。
示例输入 1
1[2, 5, 5, 8, 8, 8, 9, 30, 45]
示例输出 1
1原始数组: 2, 5, 5, 8, 8, 8, 9, 30, 45 2唯一数组: 2, 5, 8, 9, 30, 45
示例输入 2
1[2, 5, 5, 8, 8, 8]
示例输出 2
1原始数组: 2,5,5,8,8,8 2唯一数组: 2,5,8
No configuration found for ID: 222c35c30dea615086fb6b83502853952b1589b670d410e58c734816ffb32272
你可以在上方的代码编辑器中运行以下代码:
1function showDistinct(p) { 2 // 执行去重操作 3 let lp = p.length; 4 let r = [p[0]]; 5 let i = 1, 6 k = 1; 7 8 while (i < lp) { 9 if (p[i] != p[i - 1]) { 10 r[k] = p[i]; 11 k += 1; 12 } 13 i += 1; 14 } 15 16 console.log('原始数组: ' + p); 17 console.log('唯一数组: ' + r); 18} 19showDistinct([2, 5, 5, 8, 8, 8]);
在上述程序中:
- 我们实现了一个函数
showDistinct(),接收一个数组p作为参数。 - 使用
length方法计算数组长度,并赋值给变量lp。 - 创建一个新数组
r,其第一个元素为数组p的首元素。 - 创建变量
i和k分别用于指向数组p和r的索引,并初始化为1。 - 使用
while循环检查并跳过重复值,同时将非重复值从数组p移动到r。 - 显示两个数组。
- 函数体结束后,编写主程序调用该函数。
你可以在上方的代码编辑器中运行以下代码:
1function showDistinct(p) { 2 // 执行去重操作 3 let lp = p.length; 4 let r = [p[0]]; 5 let i = 1, 6 k = 1; 7while (i < lp) { 8 if (p[i] != p[i - 1]) { 9 r[k] = p[i]; 10 k += 1; 11 } 12 i += 1; 13} 14 15console.log('原始数组: ' + p); 16console.log('唯一数组: ' + r); 17 18} 19showDistinct([2, 5, 5, 8, 8, 8]);
在上述程序中:
-
我们实现了一个函数
showDistinct(),接收一个数组p作为参数。 -
使用
length方法计算数组长度,并赋值给变量lp。 -
创建一个新数组
r,其第一个元素为数组p的首元素。 -
创建变量
i和k分别用于指向数组p和r的索引,并初始化为1。 -
使用
while循环检查并跳过重复值,同时将非重复值从数组p移动到r。 -
显示两个数组。
-
函数体结束后,编写主程序调用该函数。
在数组中搜索字符串的函数
编写一个函数,检查某个字符串是否存在于数组中。如果存在,则显示其在数组中的索引。调用该函数以显示结果。
示例输入 1
-
第一个参数:数组
1['2','55','888','9','30','45'] -
第二个参数:字符串
1'888'
示例输出 1
1888 在索引 2 处找到
示例输入 2
-
第一个参数:数组
1['2','55','888','9','30','45'] -
第二个参数:字符串
1'50'
示例输出 2
1*** 50 在数组中未找到 ***
No configuration found for ID: 1bb980c9c67312feeb7dbc1327229addff667a623972db2aa25a64ecfffdad1d
你可以在上方的代码编辑器中运行以下代码:
1function searchStr(p, r) { 2 // 执行字符串搜索 3 let lp = p.length; 4 let i = 0; 5 let found = 0; 6 while (i < lp) { 7 if (p[i] == r) { 8 console.log(r + " 在索引 " + i + " 处找到"); 9 found = 1; 10 } 11 i += 1; 12 } 13 if (found == 0) { 14 console.log("*** " + r + " 在数组中未找到 ***") 15 } 16} 17let p = ['2', '55', '888', '9', '30', '45']; 18let key = '888'; 19searchStr(p, key);
在上述程序中:
- 我们实现了一个函数
searchStr(),接收一个数组p和一个待搜索的变量r。 - 使用
length方法计算数组p的长度,并赋值给变量lp。 - 创建两个变量
i和found,并初始化为0。 - 使用
while循环检查数组p中每个索引处的值是否等于r。 - 如果找到匹配值,则显示其在数组中的索引。
- 函数体结束后,通过传入数组
p和变量key的值来调用函数。
你可以在上方的代码编辑器中运行以下代码:
1function searchStr(p, r) { 2 // 执行字符串搜索 3 let lp = p.length; 4 let i = 0; 5 let found = 0; 6 while (i < lp) { 7 if (p[i] == r) { 8 console.log(r + " 在索引 " + i + " 处找到"); 9 found = 1; 10 } 11 i += 1; 12 } 13 if (found == 0) { 14 console.log("*** " + r + " 在数组中未找到 ***") 15 } 16} 17let p = ['2', '55', '888', '9', '30', '45']; 18let key = '888'; 19searchStr(p, key);
在上述程序中:
-
我们实现了一个函数
searchStr(),接收一个数组p和一个待搜索的变量r。 -
使用
length方法计算数组p的长度,并赋值给变量lp。 -
创建两个变量
i和found,并初始化为0。 -
使用
while循环检查数组p中每个索引处的值是否等于r。 -
如果找到匹配值,则显示其在数组中的索引。
-
函数体结束后,通过传入数组
p和变量key的值来调用函数。
显示斐波那契数列的函数
斐波那契数列是一个每个数都是前两个数之和的序列。编写一个函数 fibo,接收参数 n 表示要生成的斐波那契数列的项数。该函数应返回一个包含该序列的数组。调用该函数以显示结果。
示例输入
110
示例输出
1斐波那契数列的前 10 项为:0,1,1,2,3,5,8,13,21,34 2*** 生成斐波那契数列结束 ***
No configuration found for ID: 5e7561b7c94b0f256b6addcb8b47f87f17b12c563839493940aefe15fc1e0489
你可以在上方的代码编辑器中运行以下代码:
1function fibo(n) { 2 if (n < 1) { 3 console.log("似乎所需斐波那契数的数量无效: " + n); 4 return; 5 } else { 6 let fib = [0]; 7 if (n > 1) { 8 fib[1] = 1; 9 } 10 let count = 2; 11 while (count < n) { 12 fib[count] = fib[count - 2] + fib[count - 1]; 13 count += 1; 14 } 15 return fib; 16 } 17} 18let nterms = 10; 19console.log("斐波那契数列的前 " + nterms + " 项为: " + fibo(nterms)); 20console.log("*** 生成斐波那契数列结束 ***");
在上述程序中:
- 我们实现了一个函数
fibo(),接收参数n。 - 变量
n表示斐波那契数列的总项数。 - 第一个
if语句限制n的值不能小于 1。 fib = [0]创建一个初始值为0的数组。- 第二个
if语句检查n的值。如果大于 1,则将1赋值给fib[1]。 - 使用变量
count记录当前项数,初始值为 2。 - 在
while循环中,fib[count] = fib[count-2] + fib[count-1]生成斐波那契数列,直到count小于n。 - 函数返回数组
fib。 - 函数体结束后,通过
console.log调用函数,显示函数返回的数组。
你可以在上方的代码编辑器中运行以下代码:
1function fibo(n) { 2 if (n < 1) { 3 console.log("似乎所需斐波那契数的数量无效: " + n); 4 return; 5 } else { 6 let fib = [0]; 7 if (n > 1) { 8 fib[1] = 1; 9 } 10 let count = 2; 11 while (count < n) { 12 fib[count] = fib[count - 2] + fib[count - 1]; 13 count += 1; 14 } 15 return fib; 16 } 17} 18let nterms = 10; 19console.log("斐波那契数列的前 " + nterms + " 项为: " + fibo(nterms)); 20console.log("*** 生成斐波那契数列结束 ***");
在上述程序中:
-
我们实现了一个函数
fibo(),接收参数n。 -
变量
n表示斐波那契数列的总项数。 -
第一个
if语句限制n的值不能小于1。 -
fib = [0]创建一个初始值为0的数组。 -
第二个
if语句检查n的值。如果大于1,则将1赋值给fib[1]。 -
使用变量
count记录当前项数,初始值为2。 -
在
while循环中,fib[count] = fib[count-2] + fib[count-1]生成斐波那契数列,直到count小于n。 -
函数返回数组
fib。 -
函数体结束后,通过
console.log调用函数,显示函数返回的数组。