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+')');
});
導致相同的行爲。
有人可以解釋這一點,並提供一個解決方案?
工作完全正常,謝謝!對於其他讀者:缺少')' - 它應該是})(v,i)));在最後一行 – forste 2012-04-17 16:09:52
哎呦..固定,;-) – micha 2012-04-17 17:15:12
你可以給你一個簡短的解釋(或鏈接到閱讀)嗎?是通過值傳遞給閉包的值,爲什麼它與閉包一起工作,而不是沒有它? – forste 2012-04-19 10:25:39