2012-04-17 61 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