JavaScript 函数
在本教程中,您将学习如何在 JavaScript 中定义和调用函数。
什么是函数?
函数是一组执行特定任务的语句,可以与主程序分开保存和维护。 函数提供了一种创建可重用代码包的方法,这些代码包更便携且更易于调试。 以下是使用函数的一些优点:
- 函数减少了程序中代码的重复 — 函数允许您将常用的代码块提取到单个组件中。 现在,您可以通过在脚本中的任意位置调用此函数来执行相同的任务,而无需一次又一次地复制和粘贴相同的代码块。
- 函数使代码更易于维护 — 由于一次创建的函数可以多次使用,因此函数内部所做的任何更改都会自动在所有地方实现,而无需触及几个文件。
- 函数更容易消除错误 —当程序被细分为函数时,如果发生任何错误,您就可以确切地知道是什么函数导致了错误以及在哪里找到它。 因此,修复错误变得容易得多。
以下部分将向您展示如何在脚本中定义和调用函数。
定义和调用函数
函数的声明以 function
关键字开头,然后是您要创建的函数的名称,然后是括号,即 ()
,最后放置您的 大括号 {}
之间的函数代码。 以下是声明函数的基本语法:
// 要执行的代码
}
这是一个简单的函数示例,它将显示一条 hello 消息:
// 定义函数
function sayHello() {
alert("Hello, welcome to this website!");
}
// 调用函数
sayHello(); // 输出: Hello, welcome to this website!
一旦定义了一个函数,就可以从文档中的任何位置调用(调用)它,方法是键入它的名称,后跟一组括号,例如上面示例中的 sayHello()
。
注意: 函数名必须以字母或下划线字符开头,不能以数字开头,可选地后跟多个字母、数字或下划线字符。 函数名区分大小写,就像变量名一样。
向函数添加参数
您可以在定义函数以在运行时接受输入值时指定参数。 参数的作用类似于函数中的占位符变量; 它们在运行时被调用时提供给函数的值(称为参数)替换。
参数设置在函数的第一行括号内,如下所示:
// 要执行的代码
}
以下示例中的 displaySum()
函数将两个数字作为参数,只需将它们相加,然后在浏览器中显示结果。
// 定义函数
function displaySum(num1, num2) {
var total = num1 + num2;
alert(total);
}
// 调用函数
displaySum(6, 20); // 输出: 26
displaySum(-5, 17); // 输出: 12
您可以定义任意数量的参数。 但是,对于您指定的每个参数,在调用函数时都需要将相应的参数传递给函数,否则其值将变为 undefined
。 让我们考虑以下示例:
// 定义函数
function showFullname(firstName, lastName) {
alert(firstName + " " + lastName);
}
// 调用函数
showFullname("Clark", "Kent"); // 输出: Clark Kent
showFullname("John"); // 输出: John undefined
函数参数的默认值 ES6
使用 ES6,现在您可以为函数参数指定默认值。 这意味着如果在调用函数时没有为函数提供参数,则将使用这些默认参数值。 这是 JavaScript 中最受期待的特性之一。 这是一个例子:
function sayHello(name = 'Guest') {
alert('Hello, ' + name);
}
sayHello(); // 输出: Hello, Guest
sayHello('John'); // 输出: Hello, John
在 ES6 之前,为了达到同样的效果,我们必须编写如下代码:
function sayHello(name) {
var name = name || 'Guest';
alert('Hello, ' + name);
}
sayHello(); // 输出: Hello, Guest
sayHello('John'); // 输出: Hello, John
要了解其他 ES6 功能,请查看 JavaScript ES6 功能章节。
从函数返回值
函数可以使用 return
语句将值返回给调用该函数的脚本。 该值可以是任何类型,包括数组和对象。
return
语句通常作为函数的最后一行放在右大括号之前,并以分号结束,如下例所示。
// 定义函数
function getSum(num1, num2) {
var total = num1 + num2;
return total;
}
// 显示返回值
alert(getSum(6, 20)); // 输出: 26
alert(getSum(-5, 17)); // 输出: 12
一个函数不能返回多个值。 但是,您可以通过返回 数组 值来获得类似的结果,如下例所示。
// 定义函数
function divideNumbers(dividend, divisor){
var quotient = dividend / divisor;
var arr = [dividend, divisor, quotient];
return arr;
}
// 将返回值存储在变量中
var all = divideNumbers(10, 2);
// 显示单个值
alert(all[0]); // 输出: 10
alert(all[1]); // 输出: 2
alert(all[2]); // 输出: 5
使用函数表达式
我们之前用来创建函数的语法称为函数声明。 还有另一种用于创建函数的语法,称为函数表达式。
// 函数声明
function getSum(num1, num2) {
var total = num1 + num2;
return total;
}
// 函数表达式
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)); // 输出: 15
var sum = getSum(7, 25);
alert(sum); // 输出: 32
注意: 在函数声明中,不需要在右大括号之后放置分号。 但另一方面,函数表达式应始终以分号结尾。
提示: 在 JavaScript 中,函数可以存储在变量中,作为参数传递给其他函数,作为返回值从函数传递出去,并在运行时构造。
函数声明和函数表达式的语法看起来非常相似,但它们的求值方式不同,请查看以下示例:
declaration(); // 输出: Hi, I'm a function declaration!
function declaration() {
alert("Hi, I'm a function declaration!");
}
expression(); // 未捕获的类型错误:未定义不是函数
var expression = function() {
alert("Hi, I'm a function expression!");
};
在上面的例子中可以看到,函数表达式在定义之前被调用时抛出了异常,但函数声明执行成功。
JavaScript 在程序执行前解析声明函数。 因此,程序是否在定义之前调用该函数并不重要,因为 JavaScript 在幕后的当前作用域顶部有 提升函数。 函数表达式在分配给变量之前不会被计算; 因此,调用时它仍然是未定义的。
ES6 引入了更短的语法来编写称为 箭头函数 的函数表达式,请查看 JavaScript ES6 特性 章节以了解更多信息。
了解变量作用域
但是,您可以在 JavaScript 中的任何位置声明变量。 但是,声明的位置决定了变量在 JavaScript 程序中的可用性范围,即可以使用或访问变量的位置。 这种可访问性称为变量作用域。
默认情况下,函数内声明的变量具有局部作用域,这意味着无法从该函数外部查看或操作它们,如下例所示:
// 定义函数
function greetWorld() {
var greet = "Hello World!";
alert(greet);
}
greetWorld(); // 输出: Hello World!
alert(greet); // Uncaught ReferenceError: greet is not defined
但是,在函数外部的程序中声明的任何变量都具有全局作用域,即它对所有脚本都可用,无论该脚本是在函数内部还是外部。 这是一个例子:
var greet = "Hello World!";
// 定义函数
function greetWorld() {
alert(greet);
}
greetWorld(); // 输出: Hello World!
alert(greet); // 输出: Hello World!