node.js回调中的引用
问题描述:
当出现一个基本问题时,我刚写了一些测试。我写了一个测试框架的基本框架。它首先收集数组中的所有测试(它们的回调函数),然后在一个单独的循环中执行它们。然而,这node.js回调中的引用
//test.js
var testArray = [
{
n : 1,
d : 'text1'
},
{
n : 2,
d : 'text2'
}
];
var cbs = [];
function fnWithCallback(d, cb) {
console.log('d=('+d+')');
cbs.push(cb);
}
for(var i=0; i < testArray.length; i++) {
var v = testArray[i];
fnWithCallback(v.d, function() {
console.log('v=('+v.n+'), i=('+i+')');
});
}
for(var j=0; j < cbs.length; j++) {
cbs[j]();
}
当我运行这个示例中,我得到这个:
> node test.js
d=(text1)
d=(text2)
v=(2), i=(2)
v=(2), i=(2)
这意味着在回调“V”已经被分配给最后一个数组的最后一个元素,“i”键它是最后一个状态,而不是回调被创建并传递给'fnWithCallback'函数时的状态。但是,由于'd'在回调中被打印出来,所以当'fnWithCallback'被调用时它具有元素的值。
“Unlooping”循环不起作用。
var v = testArray[0];
fnWithCallback(v.d, function() {
console.log('v=('+v.n+')');
});
v = testArray[1];
fnWithCallback(v.d, function() {
console.log('v=('+v.n+')');
});
导致相同的行为。
有人可以解释这一点,并提供一个解决方案?
答
使用闭包
fnWithCallback(v.d, (function(v,i){
return function() {
console.log('v=('+v.n+'), i=('+i+')');
};
})(v,i)));
工作完全正常,谢谢!对于其他读者:缺少')' - 它应该是})(v,i)));在最后一行 – forste 2012-04-17 16:09:52
哎呦..固定,;-) – micha 2012-04-17 17:15:12
你可以给你一个简短的解释(或链接到阅读)吗?是通过值传递给闭包的值,为什么它与闭包一起工作,而不是没有它? – forste 2012-04-19 10:25:39