JavaScript 函数

在本教程中,你将学习如何在 JavaScript 中定义和调用函数。

什么是功能?

函数是一组执行特定任务的语句,可以与主程序分开保存和维护。函数提供了一种创建可重用代码的方法,这些代码包更易于移植且更易于调试。以下是使用函数的一些优点:

  • 函数减少了程序中代码的重复 - 函数允许你将常用的代码块提取到单个组件中。现在,你可以通过在脚本中的任何位置调用此函数来执行相同的任务,而无需一次又一次地复制和粘贴相同的代码块。
  • 函数使代码更易于维护 - 由于创建一次的函数可以多次使用,因此在函数内部进行的任何更改都会在所有位置自动实现,而不会触及多个文件。
  • 函数可以更容易地消除错误 - 当程序细分为函数时,如果发生任何错误,你确切知道导致错误的函数以及在何处找到错误。因此,修复错误变得更加容易。

以下部分将向你展示如何在脚本中定义和调用函数。

定义和调用函数

函数的声明以 function 关键字开头,后跟要创建的函数的名称,后跟括号 () ,最后将函数的代码放在大括号 {} 之间。这是声明函数的基本语法:

function functionName() {
    // Code to be executed
}

这是一个函数的简单示例,它将显示一条问候消息:

// Defining function
function sayHello() {
    alert("Hello, welcome to this website!");
}
 
// Calling function
sayHello(); // 0utputs: Hello, welcome to this website!

定义函数后,可以从文档中的任何位置调用,方法是键入其名称,后跟一组括号,如上例所示的 sayHello()

注意: 函数名称必须以字母或下划线字符开头,而不是数字,可选地后跟更多的字母、数字或下划线字符。函数名称区分大小写,就像变量名一样。

向函数添加参数

定义函数以在运行时接受输入值时,可以指定参数。参数的作用类似于函数中的占位符变量; 它们在运行时被调用时提供给函数的值(称为参数)替换。

参数在括号内的函数的第一行设置,如下所示:

function functionName( parameter1 , parameter2 , parameter3 ) { 
    // Code to be executed 
} 

以下示例中的 displaySum() 函数将两个数字作为参数,只需将它们一起添加,然后在浏览器中显示结果。

// Defining function
function displaySum(num1, num2) {
    var total = num1 + num2;
    alert(total);
}
 
// Calling function
displaySum(6, 20); // 0utputs: 26
displaySum(-5, 17); // 0utputs: 12

你可以根据需要定义任意数量的参数。但是,对于你指定的每个参数,在调用时需要将相应的参数传递给函数,否则其值将变为 undefined 。让我们参考以下示例:

// Defining function
function showFullname(firstName, lastName) {
    alert(firstName + " " + lastName);
}
 
// Calling function
showFullname("Clark", "Kent"); // 0utputs: Clark Kent
showFullname("John"); // 0utputs: John undefined

函数参数的默认值 (ES6)

ES6 中可以为函数参数指定默认值。这意味着如果在调用时没有为函数提供参数,则将使用这些默认参数值。这是 JavaScript 中最受期待的功能之一。这是一个例子:

function sayHello(name = 'Guest') {
    alert('Hello, ' + name);
}

sayHello(); // 0utputs: Hello, Guest
sayHello('John'); // 0utputs: Hello, John

在 ES6 之前,要达到同样的目的,我们必须写下这样的代码:

function sayHello(name) {
    var name = name || 'Guest'; 
    alert('Hello, ' + name);
}

sayHello(); // 0utputs: Hello, Guest
sayHello('John'); // 0utputs: Hello, John

要了解其他 ES6 功能,请查看 JavaScript ES6 功能章节。

从函数返回值

函数可以使用 return 语句将值返回给调用函数的脚本。该值可以是任何类型,包括数组和对象。

return 语句通常作为结束大括号之前的函数的最后一行放置,并以分号结束,如下例所示。

// Defining function
function getSum(num1, num2) {
    var total = num1 + num2;
    return total;
}
 
// Displaying returned value
alert(getSum(6, 20)); // 0utputs: 26
alert(getSum(-5, 17)); // 0utputs: 12

函数不能返回多个值。但是,你可以通过返回数组来获得类似的结果,如以下示例所示。

// Defining function
function divideNumbers(dividend, divisor){
    var quotient = dividend / divisor;
    var arr = [dividend, divisor, quotient];
    return arr;
}
 
// Store returned value in a variable
var all = divideNumbers(10, 2);
 
// Displaying individual values
alert(all[0]); // 0utputs: 10
alert(all[1]); // 0utputs: 2
alert(all[2]); // 0utputs: 5

使用函数表达式

我们在创建函数之前使用的语法称为函数声明。还有另一种创建函数的语法,称为函数表达式。

// Function Declaration
function getSum(num1, num2) {
    var total = num1 + num2;
    return total;
}
 
// Function Expression
var getSum = function(num1, num2) {
    var total = num1 + num2;
    return total;
}

一旦函数表达式存储在变量中,该变量就可以用作函数:

var getSum = function(num1, num2) {
    var total = num1 + num2;
    return total;
}
 
alert(getSum(5, 10)); // 0utputs: 15
 
var sum = getSum(7, 25);
alert(sum); // 0utputs: 32

注意: 在 JavaScript 中,函数可以存储在变量中,作为参数传递给其他函数,作为返回值传递出函数,并在运行时构造。

函数声明函数表达式的语法看起来非常相似,但它们的计算方式不同,请参阅以下示例:

declaration(); // Outputs: Hi, I'm a function declaration!
function declaration() {
    alert("Hi, I'm a function declaration!");
}
 
expression(); // Uncaught TypeError: undefined is not a function
var expression = function() {
    alert("Hi, I'm a function expression!");
}

正如你在前面的示例中所看到的,函数表达式在定义之前调用时引发了异常,但函数声明已成功执行。

程序执行前的 JavaScript 解析声明函数。因此,程序在定义之前调用函数并不重要,因为 JavaScript 已将函数提升到幕后当前作用域的顶部。在将函数表达式赋值给变量之前,不会对其求值; 因此,在调用时它仍然是未定义的。

ES6 为写入函数表达式引入了更短的语法,称为箭头函数,请查看 JavaScript ES6 功能章节以了解更多信息。

了解可变范围

但是,你可以在 JavaScript 中的任何位置声明变量。但是,声明的位置决定了 JavaScript 程序中变量可用性的范围,即可以使用或访问变量的位置。此可访问性称为可变范围

默认情况下,在函数内声明的变量具有局部作用域,这意味着无法从该函数外部查看或操作它们,如下例所示:

// Defining function
function greetWorld() {
    var greet = "Hello World!";
    alert(greet);
}
 
greetWorld(); // Outputs: Hello World!
 
alert(greet); // Uncaught ReferenceError: greet is not defined

但是,在函数外部的程序中声明的任何变量都具有*全局范围,*即它将可用于所有脚本,无论该脚本是在函数内还是在外部。这是一个例子:

var greet = "Hello World!";
 
// Defining function
function greetWorld() {
    alert(greet);
}
 
greetWorld();  // Outputs: Hello World!
 
alert(greet); // Outputs: Hello World!