【问题标题】:IIFE vs function call (with parameters), inside a loopIIFE vs 函数调用(带参数),在循环内
【发布时间】:2016-11-21 19:11:04
【问题描述】:

我对在 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) -

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

示例 2(使用 IIFE)-

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);
}


我的问题是上面的示例 1 和示例 2 有什么区别,应该优先选择一个(在什么情况下)?

【问题讨论】:

  • hmm... 你的意思是在 iife 内部而不是外部声明 str 吗?一旦发生计数回调,您可能(或将)在外部声明它的值时遇到问题。不完全确定为什么与示例 1 相比,示例 2 中的处理方式不同。两个 sn-ps 似乎都试图解决 for 循环关闭问题,但是由于 str 的方式,两者中只有一个如此有效声明。
  • 我不明白你。你是在比较苹果和橙子吗?
  • @Gogol - console.log 在两种情况下都不会打印相似的结果吗?
  • 正确使用的两个选项都是解决 for 循环闭合问题的可行解决方案。更现代的解决方案包括使用箭头函数、数组迭代方法和块范围变量(let/const)
  • 不同之处在于,一个使用先前定义的函数,而另一个为每次迭代创建一个新函数。显然,之前定义的函数路由会更高效。但是,您可以放弃这两个选项并使用let 来解决问题,完全不需要函数。

标签: javascript function loops asynchronous iife


【解决方案1】:

正如@Kevin B 在 cmets 中对问题所述,示例 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-24
    • 2015-08-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多