闭包
了解闭包(函数的函数)的肯定知道,输出的是10个10,但是你要具体解释呢?
function test() { var arr=[]; for(var i=0;i<10;i++){ arr[i]=function () { console.log(i); } } return arr; } var myArr=test(); for(var j=0;j<10;j++){ myArr[j](); } //10,10,10,10,10,10,10,10,10,10
我们需要知道console.log(i);这句是在什么时候调用的;
return出去的时候还未被调用;
是在给arr全部都返回出去了,才去调用的;
此时i早已变成10了。
test执行完后,test和ao已经断线。但是他的ao没有销毁的,被arr里面function有另一条线连接着;
test里面的AO,i变量现在的结果是10,而且被arr里面每个function拽住;
如想正确输入0,1,2,3,4,5,6,7,8,9,10
1.立即执行函数
function test() { var arr=[]; for(var i=0;i<10;i++){ (function(j){ arr[j]=function () { console.log(j); } })(i) } return arr; } var myArr=test(); for(var j=0;j<10;j++){ myArr[j](); } //0,1,2,3,4,5,6,7,8,9,10
2.借用外部的参数
function test() { var arr=[]; for(var i=0;i<10;i++){ arr[i]=function (num) { console.log(num); } } return arr; } var myArr=test(); for(var j=0;j<10;j++){ myArr[j](j); } //0,1,2,3,4,5,6,7,8,9,10
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了