Javascript IIFE vs函数调用(带参数),在循环内

Javascript IIFE vs函数调用(带参数),在循环内,javascript,function,loops,asynchronous,iife,Javascript,Function,Loops,Asynchronous,Iife,我对在for循环中使用IIFE和使用普通函数调用(带参数)感到困惑 假设函数是- function print_doc_count(i){ var str= "collection" + i.toString(); db.collection(str).count(function(err, res){ if(!err){ console.log("docs in collection: "+str+" = "+res);

我对在for循环中使用IIFE和使用普通函数调用(带参数)感到困惑

假设函数是-

function print_doc_count(i){
    var str= "collection" + i.toString();
    db.collection(str).count(function(err, res){
        if(!err){
            console.log("docs in collection: "+str+" = "+res);
        }
    });
}

示例1(无IIFE)-


对于(var i=1;i,如@Kevin B在对问题的评论中所述,示例1(无IIFE)是一个更好的解决方案

function print_doc_count(i){
    var str= "collection" + i.toString();
    db.collection(str).count(function(err, res){
        if(!err){
            console.log("docs in collection: "+str+" = "+res);
        }
    });
}

for(var i=1; i<=10; i++){
    print_doc_count(i);
}
功能打印\单据\计数(一){
var str=“collection”+i.toString();
db.collection(str).count(函数(err,res){
如果(!err){
console.log(“集合中的文档:+str+”=+res);
}
});
}

对于(var i=1;ihmm…您肯定是想在iife内而不是在iife外声明
str
?如果在iife外声明,您可以(或者,将)一旦发生计数回调,它的值就会出现问题。我不完全清楚为什么在示例2中处理与示例1不同。这两个代码段似乎都试图绕过for循环闭包问题,但是由于
str
的声明方式,这两个代码段中只有一个有效。我不明白您的意思。是吗试图比较苹果和橙色?@Gogol-console.log会不会在这两种情况下打印出相似的结果?正确使用的两种选项都是for循环闭包问题的可行解决方案。更现代的解决方案包括使用箭头函数、数组迭代方法和块作用域变量(let/const)不同之处在于,一个使用先前定义的函数,而另一个为每次迭代创建新函数。显然,先前定义的函数路径将更具性能。但是,您可以放弃这两个选项,使用
let
来解决问题,根本不需要函数。
for(var i=1; i<=10; i++){
    (function print_doc_count(i){
        var str= "collection" + i.toString();
        db.collection(str).count(function(err, res){
            if(!err){
                console.log("docs in collection: "+str+" = "+res);
                // str needed closure, it contains the value i!
            }
        });
    })(i);
}
function print_doc_count(i){
    var str= "collection" + i.toString();
    db.collection(str).count(function(err, res){
        if(!err){
            console.log("docs in collection: "+str+" = "+res);
        }
    });
}

for(var i=1; i<=10; i++){
    print_doc_count(i);
}