2011-06-18 149 views
2

這裏是我的代碼:如何將參數傳遞給setTimeout調用中定義的匿名函數?

 
function addRcd2(timeOut){ 
    for(var c=0; c less 5; c++){ 
    var rcdi = "rcd_"+c+""; 
    setTimeout(function(){ 
     $('.tbl1 tbody').append(rcdi); 
    },timeOut*c); 
    } 
} 

這段代碼的輸出是行具有相同的文字rcd_5表。

我的目標是有一個錶行有不同的記錄rcd_1,...,rcd_5

任何想法?

+1

該代碼應該工作。我沒有看到任何問題。 – Kon

+2

不,它不會,這是一個常見的關閉錯誤 – Halcyon

回答

7

典型在循環中創建函數問題。您傳遞給setTimeout的所有封閉都有一個參考相同rcdi變量。定義循環內的變量是一樣的外面定義它:

var rcdi; 
for(var c=0; c < 5; c++){ 
    rcdi = "rcd_"+c+""; 
    // ... 
} 

這使得它更爲明顯一些,你只處理這裏一個變量。

你必須引入一個新的範圍,這在JavaScript中,只能通過函數來​​實現:

function getCallback(val) { 
    return function(){ 
     $('.tbl1 tbody').append(val); 
    }; 
} 

function addRcd2(timeOut){ 
    for(var c=0; c < 5; c++){ 
    setTimeout(getCallback("rcd_"+c),timeOut*c); 
    } 
} 

正如你可以在其他的答案看,你也可以使用即時功能。使用你發現更具可讀性的東西。

2
function addRcd2(timeOut){ 
    for(var c=0; c less 5; c++){ 
    var rcdi = "rcd_"+c+""; 
    setTimeout((function(x) { 
     return function(){ 
     $('.tbl1 tbody').append(x); 
     }; 
    })(rcdi),timeOut*c); 
    } 
} 
+0

你錯位你的第一個右括號! – Halcyon

+0

@Frits van Campen謝謝:) – levu

相關問題