函数允许您定义一个代码块,给它命名,然后根据需要反复执行。
可以使用function关键字定义函数,也可以使用()运算符执行函数。
在本教程的前面,您了解了使用以下语法声明函数:
function nameOfFunction(parameters) { // 要执行的语句 }
声明的函数不会立即执行。声明的函数只是对函数命名,并指定函数被调用时的操作。
function greet() { document.write("Hello, World!"); }测试看看
在上面的示例中,我们已经声明(定义)了一个名为的函数greet,该函数输出一条消息“ Hello,World!”。可以使用()运算符调用此功能,例如greet()。
JavaScript允许我们将函数分配给变量,然后将该变量用作函数。它称为函数表达式。
//函数表达式可以存储在变量中 var sum = function(a, b) { return a + b; }; // 该变量可用作函数 var x = sum(100, 8);测试看看
上面的函数实际上是一个匿名函数(没有名称的函数)。
存储在变量中的函数不需要函数名。始终使用变量名来调用它们。
上面的函数以分号结尾,因为它是可执行语句的一部分。
在本教程的前面,您了解了JavaScript提升。
提升是JavaScript将声明移到当前作用域顶部的默认行为。
因此,可以在声明JavaScript函数之前对其进行调用:
// 声明前调用函数 greet(); function greet() { document.getElementById("output").innerHTML = "Hello World"; }测试看看
使用表达式定义的函数不会被提升。
可以使函数表达式“自执行”。
自执行是一种JavaScript函数,它在定义后立即运行。
自动调用(启动)自执行表达式,而不需要调用它。也称为IIFE(立即调用的函数表达式)。
如果函数表达式后跟(),则函数表达式将自动执行。
(function () { // 要执行的语句 })();测试看看
将IIFE分配给变量将存储函数的返回值,而不是函数定义本身:
let result = (function () { let name = "Seagull"; return name; })(); //立即创建输出 result; // "Seagull"测试看看
下面的示例演示如何将参数传递给IIFE(立即调用的函数表达式):
(function (x, y) { document.getElementById("output").innerHTML = x + y; })(5, 10);测试看看
回调函数是作为参数传递给另一个函数的函数,然后在外部函数中调用它来完成某种例程或操作。
function greet(name) { alert("Hello " + name); } function processInput(callback) { let name = prompt("Please enter your name:"); callback(name); } // Passing greet function into processInput function as an argument processInput(greet);测试看看
上面的示例是一个同步回调,因为它将会立即执行。
但是,回调通常用于在异步操作完成后继续执行代码。
递归是一种迭代操作的技术,方法是使函数重复调用自身直到获得结果。
下面的示例使用递归获取数字的阶乘:
var factorial = function(number) { if (number <= 0) { return 1; } else { return (number * factorial(number - 1)); } }; document.getElementById("output").innerHTML = factorial(5);测试看看
到目前为止,我们已经介绍了如何使用function关键字定义函数。
但是,从ECMAScript 6开始,有一种更新,更简洁的方法来定义一个称为箭头函数表达式的函数。
众所周知,箭头函数用等号后跟大于号表示:=>。
//函数表达式 var sum = function(x, y) { return x + y; } // 箭头函数 const sum = (x, y) => x + y;测试看看
箭头函数没有自己的this。它们不适用于定义对象方法。
箭头功能未提升。必须先定义它们,然后再使用它们。
使用const比使用更加安全var,因为函数表达式始终为常数。
return如果函数是单个语句,则只能省略关键字和大括号。因此,始终保留它们可能是一个好习惯。
仅当函数是单个语句时,才能省略 return 关键字和大括号。所以,永远保留使用它们是一个好习惯。
const sum = (x, y) => { return x + y };测试看看