JavaScript 函数

函数是封装了一段可复用代码的块。你定义一次,就可以在任何地方调用它——传入不同的数据,得到不同的结果。

声明函数

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

// 调用函数
console.log(greet('张三')); // "你好,张三!"
console.log(greet('李四')); // "你好,李四!"
  • function — 关键字,声明一个函数
  • greet — 函数名
  • (name) — 参数列表,调用时传入的值
  • return — 返回值(没有 return 则返回 undefined
  • {} — 函数体,执行的代码

参数

参数与实参

javascript
function add(a, b) {  // a、b 是参数(parameter)
  return a + b;
}

add(3, 5);  // 3、5 是实参(argument),返回 8

JavaScript 不检查参数数量——多了忽略,少了变为 undefined

javascript
function log(a, b) {
  console.log(a, b);
}

log(1);       // 1 undefined(b 未传入)
log(1, 2, 3); // 1 2(多余的 3 被忽略)

默认参数

javascript
function greet(name = '用户') {
  return `你好,${name}!`;
}

console.log(greet('张三')); // "你好,张三!"
console.log(greet());       // "你好,用户!"

rest 参数(...

将剩余的所有参数收集到一个数组中:

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

console.log(sum(1, 2, 3));    // 6
console.log(sum(1, 2, 3, 4)); // 10

return — 返回值

return 立即结束函数执行,并将后面的值返回给调用者:

javascript
function max(a, b) {
  if (a > b) return a;
  return b;
}

console.log(max(10, 20)); // 20

没有 return 或只有 return; 的函数返回 undefined

函数表达式

将函数赋给变量:

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

greet('张三'); // "你好,张三!"

函数声明和函数表达式的主要区别:函数声明会提升(可以在声明前调用),函数表达式不会。

箭头函数(Arrow Function)

ES6 引入的更简洁的函数写法:

javascript
// 完整语法
const add = (a, b) => {
  return a + b;
};

// 只有一条 return 语句时可省略花括号和 return
const add = (a, b) => a + b;

// 只有一个参数时可省略参数的括号
const square = x => x * x;

// 没有参数时必须写空括号
const sayHello = () => 'Hello';

// 返回对象字面量时加括号(否则 {} 会被当成函数体)
const makeUser = name => ({ name });

箭头函数和普通函数有一个关键区别:箭头函数没有自己的 this,它的 this 继承自外层作用域。这意味着箭头函数不适合作为对象方法(需要 this 指向对象本身时),但非常适合回调函数(mapfilter、事件监听器中使用外层 this 的场景)。关于 this 的基础用法,见 对象基础 章节。

回调函数

函数可以作为参数传递给另一个函数——这称为回调(callback):

javascript
// 自定义 forEach
function forEach(array, callback) {
  for (const item of array) {
    callback(item);
  }
}

forEach([1, 2, 3], item => {
  console.log(item * 2);
});
// 输出:2  4  6

回调是 JavaScript 异步编程的基础,也是 mapfilter、事件监听器等 API 的核心机制。

函数定义方式速查

方式语法提升适用场景
函数声明function f() {}通用,可自由定义
函数表达式const f = function() {}需要赋值给变量时
箭头函数const f = () => {}简短函数、回调

日常使用建议:顶层工具函数用函数声明,回调参数用箭头函数,赋值给变量的函数用函数表达式箭头函数(两者在此场景下差别不大)。整个项目中保持一致即可。