Logo
Section 1 / 5

定义并使用函数

学习如何在 JavaScript 中将程序划分为函数或子程序。

导入

定义并使用函数

学习如何在 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)。

...
带 return 语句的函数

让我们写出上述示例的代码。

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 &lt; 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 调用函数,显示函数返回的数组。

JavaScript 数组和字符串

通用内置函数