Skip to content

JavaScript 函数

函数是 JavaScript 中的基本构建块,它们是执行特定任务或计算的可重用代码块。函数使代码更加模块化和可维护。

什么是函数?

函数是一组封装在一起用于执行特定任务的语句。函数可以接收输入(参数),处理这些输入,并返回结果。

函数声明

函数声明语法

javascript
function functionName(parameter1, parameter2, ...) {
    // 函数体
    // 执行的代码
    return returnValue;  // 可选
}

简单示例

javascript
// 声明一个函数
function greet(name) {
    return `你好,${name}!`;
}

// 调用函数
let message = greet("张三");
console.log(message);  // 输出:你好,张三!

函数表达式

函数表达式是将函数存储在变量中:

javascript
// 函数表达式
let add = function(a, b) {
    return a + b;
};

// 调用函数
let sum = add(5, 3);
console.log(sum);  // 输出:8

箭头函数

ES6 引入了箭头函数语法,提供了一种更简洁的函数书写方式:

javascript
// 箭头函数
let multiply = (a, b) => {
    return a * b;
};

// 如果只有一个表达式,可以省略大括号和 return 关键字
let subtract = (a, b) => a - b;

// 如果只有一个参数,可以省略括号
let square = x => x * x;

// 调用箭头函数
console.log(multiply(4, 5));  // 输出:20
console.log(subtract(10, 3)); // 输出:7
console.log(square(6));       // 输出:36

参数

默认参数

ES6 允许为函数参数设置默认值:

javascript
function greet(name = "朋友") {
    return `你好,${name}!`;
}

console.log(greet());        // 输出:你好,朋友!
console.log(greet("李四"));   // 输出:你好,李四!

剩余参数

剩余参数允许我们将不定数量的参数表示为一个数组:

javascript
function sum(...numbers) {
    return numbers.reduce((total, num) => total + num, 0);
}

console.log(sum(1, 2, 3));        // 输出:6
console.log(sum(1, 2, 3, 4, 5));  // 输出:15

参数解构

javascript
function printPerson({name, age}) {
    console.log(`姓名:${name},年龄:${age}`);
}

let person = {name: "王五", age: 30};
printPerson(person);  // 输出:姓名:王五,年龄:30

返回值

函数可以返回值,也可以不返回值:

javascript
// 有返回值的函数
function add(a, b) {
    return a + b;
}

// 无返回值的函数
function logMessage(message) {
    console.log(message);
    // 隐式返回 undefined
}

let result = add(3, 4);        // result = 7
let logResult = logMessage("Hello");  // logResult = undefined

作用域和闭包

词法作用域

javascript
let globalVar = "我是全局变量";

function outerFunction() {
    let outerVar = "我是外部函数变量";
    
    function innerFunction() {
        let innerVar = "我是内部函数变量";
        console.log(globalVar);  // 可以访问全局变量
        console.log(outerVar);   // 可以访问外部函数变量
        console.log(innerVar);   // 可以访问自己的变量
    }
    
    innerFunction();
}

outerFunction();

闭包

闭包是指函数能够访问其外部作用域中的变量:

javascript
function createCounter() {
    let count = 0;
    
    return function() {
        count++;
        return count;
    };
}

let counter = createCounter();
console.log(counter());  // 输出:1
console.log(counter());  // 输出:2
console.log(counter());  // 输出:3

高阶函数

高阶函数是以函数为参数或返回函数的函数:

javascript
// 以函数为参数的函数
function operate(operation, a, b) {
    return operation(a, b);
}

let add = (a, b) => a + b;
let multiply = (a, b) => a * b;

console.log(operate(add, 5, 3));      // 输出:8
console.log(operate(multiply, 5, 3)); // 输出:15

// 返回函数的函数
function multiplier(factor) {
    return function(number) {
        return number * factor;
    };
}

let double = multiplier(2);
let triple = multiplier(3);

console.log(double(5));  // 输出:10
console.log(triple(5));  // 输出:15

立即执行函数表达式 (IIFE)

立即执行函数表达式是在定义后立即执行的函数:

javascript
(function() {
    console.log("我是立即执行函数!");
})();

// 带参数的 IIFE
(function(name) {
    console.log(`你好,${name}!`);
})("张三");

方法

当函数作为对象的属性时,称为方法:

javascript
let calculator = {
    add: function(a, b) {
        return a + b;
    },
    
    subtract: function(a, b) {
        return a - b;
    },
    
    // ES6 简写方法
    multiply(a, b) {
        return a * b;
    }
};

console.log(calculator.add(5, 3));      // 输出:8
console.log(calculator.subtract(5, 3)); // 输出:2
console.log(calculator.multiply(5, 3)); // 输出:15

递归函数

递归函数是调用自身的函数:

javascript
// 计算阶乘
function factorial(n) {
    if (n <= 1) {
        return 1;
    }
    return n * factorial(n - 1);
}

console.log(factorial(5));  // 输出:120

// 斐波那契数列
function fibonacci(n) {
    if (n <= 1) {
        return n;
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}

console.log(fibonacci(7));  // 输出:13

实际应用示例

javascript
// 表单验证函数
function validateEmail(email) {
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return emailRegex.test(email);
}

function validateForm(formData) {
    let errors = [];
    
    if (!formData.name) {
        errors.push("姓名不能为空");
    }
    
    if (!validateEmail(formData.email)) {
        errors.push("邮箱格式不正确");
    }
    
    if (formData.password.length < 6) {
        errors.push("密码至少需要6位");
    }
    
    return {
        isValid: errors.length === 0,
        errors: errors
    };
}

// 使用示例
let userData = {
    name: "张三",
    email: "zhangsan@example.com",
    password: "123456"
};

let validationResult = validateForm(userData);
if (validationResult.isValid) {
    console.log("表单验证通过!");
} else {
    console.log("验证错误:", validationResult.errors);
}

函数是 JavaScript 编程的核心,掌握函数的使用对于编写高质量的代码至关重要。