js闭包函数面试题
时间: 2025-08-01 08:48:11 AIGC 浏览: 20
### JavaScript闭包函数面试题解析
#### 1. 什么是闭包?
闭包是指一个函数能够记住并访问它的词法作用域,即使这个函数在其词法作用域之外被调用。在JavaScript中,当一个函数嵌套在另一个函数内部时,内部函数可以访问外部函数的变量和参数[^1]。
```javascript
function outerFunction() {
let a = 10;
return function innerFunction() {
console.log(a); // 内部函数访问外部函数的变量a
};
}
const closure = outerFunction();
closure(); // 输出10
```
#### 2. 闭包的经典面试题
以下是一些常见的JavaScript闭包面试题:
- **问题1**:解释以下代码的输出。
```javascript
function fun() {
var count = 1;
return function () {
count++;
console.log(count);
}
}
var fun2 = fun();
fun2(); // 输出2
fun2(); // 输出3
```
此代码展示了闭包如何保留对外部变量`count`的引用,并在每次调用`fun2()`时修改它[^1]。
- **问题2**:下面代码的输出是什么?
```javascript
function immediateA(a) {
function immediateB() {
console.log(a);
}
immediateB();
}
immediateA(0); // 输出0
```
此代码展示了闭包如何捕获外部函数`immediateA`中的变量`a`,并在`immediateB`中使用它[^4]。
#### 3. 闭包的实际应用场景
闭包在实际开发中有多种用途,例如:
- **模拟私有变量**:通过闭包可以在JavaScript中创建私有变量和方法。
```javascript
function createCounter() {
let count = 0;
return {
increment: function () {
count++;
console.log(count);
},
decrement: function () {
count--;
console.log(count);
}
};
}
const counter = createCounter();
counter.increment(); // 输出1
counter.decrement(); // 输出0
```
- **数据封装**:闭包可以用来封装数据,避免全局污染。
```javascript
function createStack() {
const items = [];
return {
push(item) { items.push(item); },
pop() { return items.pop(); }
};
}
const stack = createStack();
stack.push(10);
stack.push(5);
stack.pop(); // 输出5
```
此代码展示了如何使用闭包来封装栈的数据结构,防止直接访问内部数组`items`[^5]。
#### 4. 闭包与垃圾回收
闭包可能导致内存泄漏,因为闭包会持有对外部变量的引用,阻止这些变量被垃圾回收器回收。因此,在使用闭包时需要特别注意资源管理[^3]。
```javascript
function outerFunction() {
let a = 1;
let b = 2;
let c = 3;
return function innerFunction() {
console.log(a); // 虽然只使用了a,但b和c也会被保留
};
}
```
###
阅读全文
相关推荐

















