在node.jscallback中引用

当一个基本问题出现时,我刚刚写了一些testing。 我写了一个testing框架的基本框架。 它首先收集数组中的所有testing(它们的callback函数),然后在一个单独的循环中执行它们。 但是,这个

//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(vd, 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) 

这意味着在callback中,'v'被分配给最后一个数组的最后一个元素,'i'到最后一个状态,而不是callback被创build并传递给'fnWithCallback'函数时的那一个。 但是,由于'd'在callback中被打印出来,所以当'fnWithCallback'被调用时,它具有元素的值。

“unlooping”循环没有帮助。

 var v = testArray[0]; fnWithCallback(vd, function() { console.log('v=('+v.n+')'); }); v = testArray[1]; fnWithCallback(vd, function() { console.log('v=('+v.n+')'); }); 

导致相同的行为。

有人可以解释这一点,并提供解决scheme?

使用闭包

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