2014-03-31 75 views
1

在將函數添加到函數數組之前,將值存儲在函數變量中的最佳(或優良)做法是什麼?當聲明函數存儲在一個函數數組中的函數值時,爲變量賦值value

例如,我們有一個計數器:

var f_counter = 0; 

...我們有一個函數數組:

var a_func = []; 

當我們添加一個函數到數組中,我們可以這樣做:

a_func.push(
    function(){ 
     examplecallbackfunction(f_counter); 
    } 
); 
f_counter++; 

這裏是例子回調函數:

function examplecallbackfunction(c) { 
<... code ...> 
} 

遍歷和執行功能陣列:

var l = a_func.length; 
while (l>0) { 
    var fnc=a_func[l-1]; 
    fnc(); 
    l--; 
} 

這裏的問題是,執行函數數組當參數f_counter就是當前全局變量f_counter,並沒有什麼f_counter是當各個功能被添加到函數數組中。

我需要一個很好的做法,它將f_counter的當前值存儲在函數定義中,然後將其分配給函數數組,並且在迭代和執行數組中的函數時,它應該使用該值調用回調函數存儲。

我需要一種方法來做到這一點,而不需要將各個值存儲在全局變量中,因爲我根據用戶交互加載了一些異步,所以我從不知道「事先」會存儲多少個以及哪種類型的函數函數數組。某些函數可能會有比f_counter更多的變量,等等......

回答

1

將函數包裝到函數中,該函數被推入數組中。這將圍繞該變量形成額外的閉包。現在閉包圍繞着全局變量,因此在實際執行該函數時,該全局變量可能不是當函數被壓入循環時的情況。

這是你的代碼,附帶一個額外的功能;沒有測試它,但你應該得到的想法:

a_func.push(
    (function(counter){ 
     function() { 
      examplecallbackfunction(counter); 
     } 
    })(f_counter) //execute function immediately 
); 
f_counter++; 
+1

太好了!謝謝你,這看起來很有前途,而且方法簡單,正是我期待的! – Plarsen

0

沒有關閉一個更簡單的方法是簡單地存儲數組中的對象:

a_func.push({counter:counter, f:function(arg){}}); 

記得您的隊列(移)/stack(pop):

while(obj=a_func.shift()){ obj.f(obj.counter); } 
+0

非常有趣的建議!我會看看這個,看看我是否可以使用它,當我有非常不同的功能添加到相同的陣列,也許這是可能的版本,但我不知道。它確實套裝我的例子,但我相信在實踐中使用時複雜性會增加 – Plarsen

1

第一種方法是使用閉包(函數返回一個將變量複製到其作用域的函數)。它是描述了這麼多次,沒有必要重複,所以只是代碼

var data = 1; 
var wrong = function() { console.info(data); }; 
var right = (function(properval) { 
    return function() { console.info(properval); }; 
})(data); 
data = 2; 
wrong(); // 2 in console 
right(); // 1 in console 

第二種方式是推到你的數組沒有的功能,但是反對像

a_func.push({ 
    callback: function(input) { console.info(input); }, 
    value: f_counter 
}); 

而且使用它的內部循環一招像

var data = a_func[l-1]; 
data.callback(data.value); 

由於您的計數器是,它將被複制由VAL反對。注意:如果value是對象,它將不起作用,因爲對象是通過引用傳遞的。

+0

偉大的解釋!謝謝! – Plarsen

1

您可以每次創建一個函數,將計數器作爲參數傳遞。 另外,你可以在傳遞它時使用f_counter ++,所以它會每次遞增計數器。

a_func.push(
    (function(i) { 
     return function() { examplecallbackfunction(i); } 
    })(f_counter++) 
); 
+1

謝謝!與tau的建議類似,這是我將使用的方法 – Plarsen

相關問題