闭包的作用

本文通过两个示例深入探讨了JavaScript中的闭包概念及其使用场景,包括如何利用闭包实现延迟执行特定函数,例如问候消息的显示及外部变量的访问。

  function say(words){
       return function(){
           alert(words)
       }
   }   
   setTimeout(say("hello word"),1000);
   setTimeout(say("I'm hungry,I'm need some food!"),2000);  

 

function closure(){
        var str = "I'm a part variable.";
        return function(){
            alert(str);
        } 
    }
    var fObj = closure();
    fObj();

【SCI复现】基于纳什博弈的多微网主体电热双层共享策略研究(Matlab代码实现)内容概要:本文围绕“基于纳什博弈的多微网主体电热双层共享策略研究”展开,结合Matlab代码实现,复现了SCI级别的科研成果。研究聚焦于多个微网主体之间的能源共享问题,引入纳什博弈理论构建双层优化模型,上层为各微网间的非合作博弈策略,下层为各微网内部电热联合优化调度,实现能源高效利用与经济性目标的平衡。文中详细阐述了模型构建、博弈均衡求解、约束处理及算法实现过程,并通过Matlab编程进行仿真验证,展示了多微网在电热耦合条件下的运行特性和共享效益。; 适合人群:具备一定电力系统、优化理论和博弈论基础知识的研究生、科研人员及从事能源互联网、微电网优化等相关领域的工程师。; 使用场景及目标:① 学习如何将纳什博弈应用于多主体能源系统优化;② 掌握双层优化模型的建模与求解方法;③ 复现SCI论文中的仿真案例,提升科研实践能力;④ 为微电网集群协同调度、能源共享机制设计提供技术参考。; 阅读建议:建议读者结合Matlab代码逐行理解模型实现细节,重点关注博弈均衡的求解过程与双层结构的迭代逻辑,同时可尝试修改参数或扩展模型以适应不同应用场景,深化对多主体协同优化机制的理解。
### 闭包在编程中的作用用途 #### 1. **保存状态** 闭包能够保存函数的状态,使得即使外部函数已经执行完毕,内部变量依然存在并可被访问。这种能力让闭包成为一种非常有用的工具来管理程序中的状态[^3]。 ```javascript function createCounter() { let count = 0; // 局部变量 return function () { // 返回一个闭包 return count++; // 访问外部函数的局部变量 }; } const counter = createCounter(); console.log(counter()); // 输出 0 console.log(counter()); // 输出 1 ``` 通过这种方式,`createCounter` 创建了一个计数器,每次调用 `counter()` 都会增加 `count` 的值,并返回当前的结果。这展示了闭包如何保持对外部变量的引用[^5]。 --- #### 2. **实现私有化** 闭包可以帮助隐藏某些变量或逻辑,从而防止全局污染或者意外修改。由于闭包可以访问外部函数的作用域,但它本身无法直接从外界访问到这些变量,因此实现了某种程度上的“私有化”[^4]。 ```javascript function makePrivateData(data) { return function (action, value) { if (action === 'get') { return data; } else if (action === 'set' && typeof value !== undefined) { data = value; } }; } const privateDataHandler = makePrivateData(10); console.log(privateDataHandler('get')); // 获取数据 -> 10 privateDataHandler('set', 20); // 设置新值 console.log(privateDataHandler('get')); // 再次获取 -> 20 ``` 这里定义了一种机制,只有通过特定接口才能读取或更改存储的数据[^3]。 --- #### 3. **延迟计算与惰性求值** 闭包可用于推迟某项操作直到实际需要的时候才去完成它。这种方法通常被称为懒加载(Lazy Loading),有助于优化性能,尤其是在处理复杂运算时[^1]。 ```javascript function lazySum(a, b) { const sum = a + b; return function () { console.log(`The result is ${sum}`); }; } const calculateLater = lazySum(7, 8); setTimeout(calculateLater, 2000); // 延迟两秒打印 The result is 15 ``` 此代码片段展示的是,在初次调用 `lazySum` 后并不会立即显示结果;而是等到触发回调时才会展现最终数值[^4]。 --- #### 4. **构建高阶函数** 高阶函数是指接受其他函数作为参数或将函数作为输出的一种形式。借助于闭包,我们可以轻松制造出各种各样的动态行为生成器,比如事件处理器、定时器等等[^2]。 ```ruby def timer_factory(message) lambda do |seconds| sleep(seconds) puts "#{message} after #{seconds} seconds" end end timer = timer_factory("Hello world!") timer.call(3) # 程序暂停三秒钟后再输出消息 ``` 上述 Ruby 示例说明了怎样利用闭包创建自定义延时通知的功能[^2]。 --- #### 5. **模拟类模块模式** 尽管 JavaScript 并未原生支持传统意义上的 OOP 类型继承模型,但是凭借闭包却能模仿出类似的结构特征。 ```javascript const Module = (() => { let _state = {}; // 私有成员 return { setState(key, val) {_state[key] = val}, getState(key) {return _state[key]} }; })(); Module.setState('name', 'John Doe'); console.log(Module.getState('name')); // John Doe ``` 这段脚本运用 IIFE 即刻执行表达式配合闭包技术搭建起了简易版模块框架。 --- ### 结论 综上所述,闭包不仅限于简单的嵌套关系体现,更是在现代软件开发过程中扮演着不可或缺的角色。无论是为了保护敏感信息还是提升应用效率,合理运用闭包都能带来显著优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值