[英]references in node.js callbacks
當一個基本問題出現時,我只是在寫一些測試。 我寫了測試框架的基本框架。 它首先將所有測試(它們的回調)收集在一個數組中,然后在一個單獨的循環中執行它們。 但是這個
//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”時它沒有該元素的值。
“取消循環”循環沒有幫助。
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)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.