请以markdown格式输出，解释一下函数闭包的概念，并给出一个简单的JavaScript示例。 ```说明：解释部分要求至少50字，代码示例要求最少10行，并且在代码示例中加入必要的注释。```
user
```markdown
### 函数闭包概述

函数闭包（Closure）是JavaScript中的一个核心概念，简单来说，闭包就是一个能够访问其自身作用域、外部函数作用域以及全局作用域中变量的函数。它允许一个函数即使在其外部作用域已经执行完毕后，仍然可以访问该外部作用域中的变量或参数。

闭包的实现依赖于JavaScript中的词法作用域，即函数在一个地方被声明，其内部定义的任何函数都会形成闭包，这些内部函数可以访问外部函数中的变量。闭包非常有用，主要用于以下几个方面：

- 创建数据封装和私有变量
- 保持状态在私有变量中
- 提供对变量的延迟访问

### JavaScript示例

以下是一个简单的JavaScript示例，展示了如何使用闭包创建计数器，该计数器保持了一个私有变量，防止外部直接访问：

```javascript
function createCounter() {
    let count = 0; // 私有变量，外部无法直接访问
    return {
        increment: function() { // 公开方法
            count++; // 访问并修改闭包中的私有变量
            console.log(`当前计数：${count}`); // 打印当前计数
        },
        decrement: function() { // 公开方法
            count--; // 访问并修改闭包中的私有变量
            console.log(`当前计数：${count}`); // 打印当前计数
        },
        getCount: function() { // 公开方法
            return count; // 只读访问闭包中的私有变量
        }
    };
}

const counter = createCounter(); // 创建一个新的计数器实例
counter.increment(); // 输出 "当前计数：1"
counter.increment(); // 输出 "当前计数：2"
console.log(counter.getCount()); // 输出 2
counter.decrement(); // 输出 "当前计数：1"
```

在这个例子中，`createCounter` 函数返回一个对象，该对象包含三个方法：`increment`、`decrement` 和 `getCount`。这些方法都可以访问和修改外部函数 `createCounter` 中的 `count` 变量，而外部代码无法直接访问 `count`。这种机制有效地创建了一个私有的状态，保持了一个计数器的值。
```
assistant