Skip to content

函数声明

函数声明是定义函数的一种方式,使用 function 关键字声明函数。函数声明会在代码执行前被提升(hoisted)到作用域顶部。

语法

javascript
function functionName(parameters) {
  // 函数体
  return value; // 可选
}

基本示例

javascript
// 简单的函数声明
function greet(name) {
  return "你好," + name + "!";
}

console.log(greet("张三")); // 输出:你好,张三!

// 无参数函数
function sayHello() {
  return "Hello, World!";
}

console.log(sayHello()); // 输出:Hello, World!

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

logMessage("这是一条日志信息");

函数提升(Hoisting)

函数声明会被提升到作用域顶部,这意味着可以在声明之前调用函数。

javascript
// 在声明之前调用函数
console.log(add(5, 3)); // 输出:8

function add(a, b) {
  return a + b;
}

参数处理

参数默认值

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

javascript
function multiply(a, b = 1) {
  return a * b;
}

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

剩余参数

使用剩余参数可以接收不定数量的参数:

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 myFunction() {
  let localVar = "局部变量";
  console.log(localVar); // 可以访问
}

myFunction();
// console.log(localVar); // 错误:无法访问

嵌套函数

函数可以嵌套在其他函数内部:

javascript
function outerFunction() {
  let outerVar = "外部变量";
  
  function innerFunction() {
    console.log(outerVar); // 可以访问外部函数的变量
  }
  
  innerFunction();
}

outerFunction(); // 输出:外部变量

递归函数

函数可以调用自身,这称为递归:

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

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

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

虽然 IIFE 是函数表达式,但它与函数声明密切相关:

javascript
// 立即执行函数表达式
(function() {
  console.log("这是一个立即执行的函数");
})();

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

函数属性和方法

函数在 JavaScript 中是对象,因此具有属性和方法:

javascript
function myFunction(a, b, c) {
  return a + b + c;
}

console.log(myFunction.length); // 输出:3(参数个数)
console.log(myFunction.name); // 输出:"myFunction"(函数名)

最佳实践

  1. 使用描述性的函数名:函数名应该清楚地表达函数的作用。

  2. 保持函数简洁:函数应该只做一件事,并且做好这件事。

  3. 合理使用参数:避免函数参数过多,一般来说不超过 3-4 个参数。

  4. 注意函数提升:虽然函数声明会被提升,但为了代码可读性,最好在调用之前声明函数。

  5. 使用 JSDoc 注释:为函数添加注释,说明参数、返回值和函数作用。

javascript
/**
 * 计算两个数的和
 * @param {number} a - 第一个数
 * @param {number} b - 第二个数
 * @returns {number} 两个数的和
 */
function add(a, b) {
  return a + b;
}
  1. 避免在函数内创建全局变量:在函数内使用 letconst 声明变量。

  2. 合理使用递归:递归虽然强大,但要注意避免栈溢出,对于深度递归可以考虑使用迭代替代。