JS中的闭包是什么

本文通过游戏场景示例介绍了JavaScript中闭包的概念及其如何用于保护变量不被外部直接访问和修改,同时允许通过特定接口进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要弄懂闭包是什么,我们需要先了解闭包的作用。

那么闭包的作用是什么?    ---保护变量。

假设我们设计一个游戏,人物的血量设置为100。那么我们可以这样写:

        var HP = 100
        function 被砍() {
            HP -= 50
            return HP
        }

可以看到,HP是一个全局变量,很容易被修改,一不小心直接改成-1000000怎么办呢?或者我们可以把它放在一个函数里,成为局部变量,但我们在其他地方访问不到。那么现在我们就可以来用闭包了。

为了隐藏变量HP,我们先在外面定义一个函数:

        function 英雄() {
            var HP = 100
            function 被砍() {
                HP -= 50
                return HP
            }
        }

变量HP已经变为局部变量,外界访问不了HP,也无法修改它。但在被砍的时候,我们需要知道自己的血量,这就要求我们可以访问,但不能修改HP。

为了对外提供接口,我们可以这样写:

        function 英雄() {
            var HP = 100
            function 被砍() {
                HP -= 50
                return HP
            }
            return 被砍// 这个格式可以将 被砍 这个函数作为开放接口,使外界访问
        }

也可以这样:

         function 英雄() {
            var HP = 100
            window.被砍 = function () {
                HP -= 50
                return HP
            }
        }

以上两种方法都保护了变量HP,同时HP也可以被外部访问,但不能被更改。

这就是闭包。

### JavaScript闭包的概念及用法 #### 什么是闭包? 在 JavaScript 中,闭包是指一个函数能够记住并访问它的词法作用域,即使这个函数是在其词法作用域之外被调用。换句话说,当一个函数可以访问它所在作用域中的变量,而这些变量不会随着函数执行完毕而销毁时,这种现象被称为闭包[^1]。 #### 闭包的特点 - **保持变量存活**:通常情况下,函数执行完成后,其内部定义的局部变量会被释放以节省内存资源。然而,在闭包的情况下,由于外部函数返回了一个引用了内部变量的函数,因此这些变量并不会立即被垃圾回收机制清除。 - **链式作用域**:JavaScript 的作用域遵循“链式查找”的原则。这意味着如果某个作用域内的变量未找到,则会继续向更上层的作用域查找,直到全局作用域为止。通过这种方式,子作用域能够访问父作用域中的任何变量,但反过来却不行。 #### 如何创建闭包? 下面是一个简单的例子展示了如何利用嵌套函数形成闭包: ```javascript function createCounter() { let count = 0; // 局部变量 return function () { // 返回匿名函数作为闭包 count++; // 修改外层函数的局部变量 console.log(count); }; } const counter = createCounter(); counter(); // 输出 1 counter(); // 输出 2 ``` 在这个案例中,`createCounter()` 函数返回的是另一个函数(即闭包)。尽管 `createCounter()` 已经执行完成,但是由它所返回的那个匿名函数仍然保留着对其内部变量 `count` 的引用关系,从而实现了计数器功能。 #### 使用场景 1. **数据封装与隐藏**:借助于闭包特性可以在一定程度上模拟私有成员的行为模式; 2. **延迟计算/异步处理**:比如定时器回调或者事件监听器注册过程中经常需要用到闭包来保存特定时刻的状态信息; 3. **工厂方法生成个性化实例**:像上面提到过的计数器就是一个典型的应用实例之一。 #### 需要注意的地方 虽然闭包非常强大且灵活多变,但也存在一些潜在风险需要注意规避: - 如果滥用可能会造成过多占用内存的情况发生,因为每次创建新闭包都会携带一份对外围环境的引用副本; - 循环绑定问题如果不小心处理的话也可能引发错误逻辑行为等问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值