在脚本的许多地方,我们经常需要执行类似的操作。
例如,当访客登录、登出,或在其他场景中,我们可能都需要显示一条漂亮的消息。
函数是程序的主要“构建块”。它们允许我们多次调用相同的代码,而无需重复书写。JavaScript 中的函数是可以定义并在需要时调用的代码片段。它们可以被看作是程序中的子程序。
函数非常有用,因为它们允许程序员只编写一次代码,然后在程序中多次重复使用,从而减少代码重复。同时,函数也使程序员能够创建逻辑上独立的代码段,这些代码段可以与程序中的其他部分区分开来。如果需要更详细的了解函数,可参考C语言的函数介绍。
我们已经见过一些内建函数的例子,比如 alert(message)
、prompt(message, default)
和 confirm(question)
。但我们也可以创建自己的函数。
函数具有以下特点:
-
可以接受零个或多个参数
-
可以在函数调用结束时返回一个指定的值
-
即使不返回值,也可以对程序的其他部分产生副作用

函数声明
要创建一个函数,我们可以使用函数声明的方式。
它的语法如下:
function showMessage() { alert( 'Hello everyone!' ); }
function
关键字写在最前面,然后是函数的名称,接着是括号中的参数列表(用逗号分隔,上面的例子中是空的,稍后我们会看到带参数的例子),最后是函数的代码,也称为“函数体”,包裹在花括号中。
function name(parameter1, parameter2, ... parameterN) { // body }
我们可以通过函数名 showMessage()
来调用新函数。
例如:
function showMessage() { alert( 'Hello everyone!' ); } showMessage(); showMessage();
调用 showMessage()
会执行该函数的代码。在这个例子中,我们会看到这条消息出现两次。
这个例子清楚地展示了函数的主要用途之一:避免代码重复。
如果我们需要更改消息的内容或显示方式,只需修改一个地方:输出消息的那个函数。
局部变量
在函数内部声明的变量只能在该函数内部访问。
例如:
function showMessage() { let message = "Hello, I'm JavaScript!"; // local variable alert( message ); } showMessage(); // Hello, I'm JavaScript! alert( message ); // <-- Error! The variable is local to the function
外部变量
函数也可以访问外部的变量,例如:
let userName = 'John'; function showMessage() { let message = 'Hello, ' + userName; alert(message); } showMessage(); // Hello, John
函数可以完全访问外部变量,也可以修改它。
例如:
let userName = 'John'; function showMessage() { userName = "Bob"; // (1) changed the outer variable let message = 'Hello, ' + userName; alert(message); } alert( userName ); // John before the function call showMessage(); alert( userName ); // Bob, the value was modified by the function
只有在函数内部没有声明同名的局部变量时,外部变量才会被使用。
如果在函数内部声明了一个同名的变量,它会遮蔽(shadow)外部的变量。例如,在下面的代码中,函数使用的是局部的 userName
,外部的 userName
被忽略了:
let userName = 'John'; function showMessage() { let userName = "Bob"; // declare a local variable let message = 'Hello, ' + userName; // Bob alert(message); } // the function will create and use its own userName showMessage(); alert( userName ); // John, unchanged, the function did not access the outer variable
全局变量
在任何函数外部声明的变量,比如上面代码中的外部 userName
,称为全局变量。
全局变量可以在任何函数中访问(除非被局部变量遮蔽)。
最好尽量减少使用全局变量。现代代码中全局变量较少或没有。大多数变量都驻留在它们各自的函数中。不过,有时全局变量可以用来存储项目级别的数据。
参数
我们可以通过参数将任意数据传递给函数。
在下面的例子中,函数有两个参数:from
和 text
。
function showMessage(from, text) { // parameters: from, text alert(from + ': ' + text); } showMessage('Ann', 'Hello!'); // Ann: Hello! (*) showMessage('Ann', "What's up?"); // Ann: What's up? (**)
当函数在 (*) 和 (**) 行被调用时,传入的值会被复制到局部变量 from
和 text
中。然后,函数使用这些局部变量。
这是另一个例子:我们有一个变量 from
并将其传递给函数。请注意:函数可以修改 from
,但外部并不会看到这个变化,因为函数总是接收到值的副本:
function showMessage(from, text) { from = '*' + from + '*'; // make "from" look nicer alert( from + ': ' + text ); } let from = "Ann"; showMessage(from, "Hello"); // *Ann*: Hello // the value of "from" is the same, the function modified a local copy alert( from ); // Ann
当一个值作为函数参数传递时,它也被称为实参。
换句话说,澄清这些术语的定义:
-
参数 是在函数声明时括号内列出的变量(这是声明时的术语)。
-
实参 是在调用函数时传递给函数的值(这是调用时的术语)。
我们声明函数时列出其参数,然后在调用时传递实参。
在上面的例子中,可以这样说:“showMessage
函数声明时有两个参数,然后在调用时传入了两个实参:from
和 "Hello"
。”
wer