函数
在 JavaScript 中,函数(Function)是一等公民(First-class Citizen),意味着函数可以像变量一样被赋值、传递和返回。函数在 JavaScript 中扮演着核心角色,是代码复用、模块化和高阶编程的关键。
一、函数的声明方式
JavaScript 提供了多种声明函数的方式,主要包括 函数声明、函数表达式、箭头函数 和 构造函数创建函数。
1.1 函数声明(Function Declaration)
js
function add(a, b) {
return a + b;
}
console.log(add(2, 3)); // 输出 5
1
2
3
4
2
3
4
特点:
- 具名函数
- 具有函数提升(Hoisting),可以在定义前调用
2.2 函数表达式(Function Expression)
js
const multiply = function (a, b) {
return a * b;
};
console.log(multiply(2, 3)); // 输出 6
1
2
3
4
2
3
4
特点:
- 赋值给变量的匿名函数
- 没有函数提升,必须先定义再调用
2.3 箭头函数(Arrow Function)
js
const divide = (a, b) => a / b;
console.log(divide(6, 3)); // 输出 2
1
2
2
特点:
- 语法更简洁
- 不会绑定
this
,适用于回调函数
2.4 构造函数创建函数(Function Constructor)
js
const subtract = new Function('a', 'b', 'return a - b');
console.log(subtract(5, 3)); // 输出 2
1
2
2
特点:
- 不推荐使用(影响性能)
- 适用于动态创建函数的场景
3. 函数的参数和默认值
3.1 默认参数
js
function greet(name = 'Guest') {
console.log(`Hello, ${name}!`);
}
greet(); // 输出 "Hello, Guest!"
1
2
3
4
2
3
4
3.2 剩余参数(Rest Parameter)
js
function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3, 4)); // 输出 10
1
2
3
4
2
3
4
4. 函数作用域和闭包
4.1 作用域(Scope)
JavaScript 作用域分为 全局作用域、函数作用域 和 块级作用域。
js
let a = 10; // 全局作用域
function test() {
let b = 20; // 函数作用域
if (true) {
let c = 30; // 块级作用域
console.log(a, b, c);
}
}
test();
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
4.2 闭包(Closure)
闭包指的是 函数可以“记住”其外部变量,并在外部作用域消失后仍然能够访问它。
js
function createCounter() {
let count = 0;
return function () {
count++;
console.log(count);
};
}
const counter = createCounter();
counter(); // 输出 1
counter(); // 输出 2
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
闭包的应用场景:
- 实现数据私有化
- 记住执行环境(如事件监听器)
5. 高阶函数(Higher-order Function)
高阶函数是指 接受一个或多个函数作为参数,或返回一个函数的函数。
5.1 作为参数的高阶函数
js
function operate(a, b, fn) {
return fn(a, b);
}
console.log(operate(4, 2, (x, y) => x + y)); // 输出 6
1
2
3
4
2
3
4
5.2 返回函数的高阶函数
js
function createMultiplier(factor) {
return function (num) {
return num * factor;
};
}
const double = createMultiplier(2);
console.log(double(5)); // 输出 10
1
2
3
4
5
6
7
2
3
4
5
6
7