函数的基本定义与声明方式
在JavaScript中,函数是一段可重复执行的代码块,用于完成特定的功能,定义函数的方式多种多样,最基础的是使用function关键字进行声明,这种方式被称为函数声明(Function Declaration),语法结构如下:

function functionName(parameters) {
// 函数体:执行特定任务的代码
return result; // 可选:返回值
}
一个简单的加法函数可以这样写:
function add(a, b) {
return a + b;
}
这种声明方式的特点是函数会被提升(hoisted),意味着在代码执行前,函数声明会被移动到当前作用域的顶部,因此可以在函数声明之前调用它。
函数表达式:灵活定义函数
除了函数声明,JavaScript还支持函数表达式(Function Expression),即将函数赋值给一个变量,根据是否匿名,函数表达式可分为匿名函数表达式和命名函数表达式。
匿名函数表达式
最常见的形式是将匿名函数(没有函数名的函数)赋值给变量:
const multiply = function(a, b) {
return a * b;
};
这里的multiply是一个变量,存储了函数的引用,与函数声明不同,函数表达式不会被提升,因此必须在赋值后才能调用。
命名函数表达式
如果需要为函数表达式命名,可以使用命名函数表达式:
const divide = function divide(a, b) {
return a / b;
};
命名函数表达式的函数名仅在函数内部可见,主要用于递归或调试场景。
箭头函数:简洁的函数写法
ES6引入了箭头函数(Arrow Function),提供了一种更简洁的函数定义方式,箭头函数的语法如下:

const functionName = (parameters) => {
// 函数体
return result;
};
当函数体只有一行且返回一个表达式时,可以进一步简化:
const square = x => x * x;
箭头函数的一个显著特点是它没有自己的this和arguments对象,而是继承自外层作用域,这使得它在回调函数中特别有用,可以避免this绑定的问题。
const numbers = [1, 2, 3]; const doubled = numbers.map(n => n * 2);
函数参数:传递数据的方式
函数参数是函数与外部交互的桥梁,JavaScript函数的参数分为形式参数和实际参数,形式参数是函数定义时列出的变量,而实际参数是调用函数时传入的值。
默认参数
ES6允许为参数设置默认值,当调用函数时未提供该参数或参数为undefined时,使用默认值:
function greet(name = 'Guest') {
return `Hello, ${name}!`;
}
console.log(greet()); // 输出:Hello, Guest!
剩余参数
剩余参数(Rest Parameters)允许将多个实参表示为一个数组,语法为...paramName。
function sum(...numbers) {
return numbers.reduce((acc, curr) => acc + curr, 0);
}
console.log(sum(1, 2, 3, 4)); // 输出:10
展开运算符
与剩余参数相反,展开运算符(Spread Operator)可以将数组或对象展开为单独的参数:
const numbers = [1, 2, 3]; console.log(Math.max(...numbers)); // 输出:3
函数的作用域与闭包
函数的作用域决定了变量的可访问性,JavaScript使用词法作用域,即函数内部可以访问外部的变量,但外部无法访问函数内部的变量。
闭包
闭包(Closure)是指函数可以访问其词法作用域之外的变量,即使该函数在其词法作用域之外执行,闭包常用于创建私有变量和函数工厂。

function createCounter() {
let count = 0;
return function() {
return ++count;
};
}
const counter = createCounter();
console.log(counter()); // 输出:1
console.log(counter()); // 输出:2
这里,count变量被闭包保护,无法从外部直接访问,但可以通过counter函数修改。
高级函数:回调与递归
回调函数
回调函数是指作为参数传递给另一个函数的函数,常用于异步编程。
function fetchData(callback) {
setTimeout(() => {
callback('Data fetched successfully');
}, 1000);
}
fetchData(data => console.log(data));
递归函数
递归函数是指在函数内部调用自身的函数,常用于解决分治问题,计算阶乘的递归函数:
function factorial(n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
console.log(factorial(5)); // 输出:120
函数作为值与高阶函数
在JavaScript中,函数是一等公民(First-class Citizens),可以像变量一样传递、赋值和返回,高阶函数(Higher-order Function)是指接受函数作为参数或返回函数的函数,常见的高阶函数包括map、filter和reduce:
const numbers = [1, 2, 3, 4]; const squared = numbers.map(n => n * n); const evens = numbers.filter(n => n % 2 === 0); const sum = numbers.reduce((acc, n) => acc + n, 0);
JavaScript函数的写法多种多样,从传统的函数声明到现代的箭头函数,每种方式都有其适用场景,理解函数的定义、参数、作用域、闭包以及高阶函数的概念,是掌握JavaScript编程的关键,通过合理选择函数定义方式,可以编写出更简洁、高效且可维护的代码,无论是简单的工具函数还是复杂的异步逻辑,函数都是JavaScript中不可或缺的核心概念。













