闭包

了解闭包(函数的函数)的肯定知道,输出的是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,10101010
复制代码

 我们需要知道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
复制代码

 

posted on   sss大辉  阅读(95)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示