2012-04-17 62 views
1

当出现一个基本问题时,我刚写了一些测试。我写了一个测试框架的基本框架。它首先收集数组中的所有测试(它们的回调函数),然后在一个单独的循环中执行它们。然而,这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+')'); 
}); 

导致相同的行为。

有人可以解释这一点,并提供一个解决方案?

回答

1

使用闭包

fnWithCallback(v.d, (function(v,i){ 
    return function() { 
     console.log('v=('+v.n+'), i=('+i+')'); 
    }; 
})(v,i))); 
+0

工作完全正常,谢谢!对于其他读者:缺少')' - 它应该是})(v,i)));在最后一行 – forste 2012-04-17 16:09:52

+0

哎呦..固定,;-) – micha 2012-04-17 17:15:12

+0

你可以给你一个简短的解释(或链接到阅读)吗?是通过值传递给闭包的值,为什么它与闭包一起工作,而不是没有它? – forste 2012-04-19 10:25:39