【发布时间】: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