2011-07-29 35 views
0

我試圖產生的回調函數中使用的數組中的一個jQuery UI的對話框生成不同的回調函數數組在Javascript

考慮下面的代碼:

for(var x in methods) 
{ 

    buttons[x] = function() { 

      var method = methods[x]; 

      var data = $('#dialog_'+model+' form').serialize(); 
      data += '&form='+model; 
      $.post(
        $('#dialog_'+model+' form').attr('action')+'method/'+method+'/', 
        data, 
        function(r) { 
          handleFormReturn(r); 
        }, 
        'json' 
      ); 
    }; 

} 

調用時,函數顯然會使用變量x的最後已知值而不是我需要的值。我怎樣才能避免這個問題,而不必訴諸使用eval()?

也許我正在談論這一切都錯了,但據我所知,不可能將參數傳遞給回調函數。

回答

1

您需要在for循環中的每次傳遞期間創建一個新的變量作用域。這隻能通過調用一個函數來完成。

function createButton(x) { 
    buttons[x] = function() { 
     var method = methods[x]; 
     var data = $('#dialog_' + model + ' form').serialize(); 
     data += '&form=' + model; 
     $.post(
     $('#dialog_' + model + ' form').attr('action') + 'method/' + method + '/', data, function (r) { 
      handleFormReturn(r); 
     }, 'json'); 
    }; 
} 
for (var x in methods) { 
    createButton(x); 
} 

現在的x值的buttons[x]功能是指將傳遞給createButton之一。

0

patrick dw的解決方案的一個直接的功能版本:

for (var x in methods) { 
    buttons[x] = (function (x) { 
     return function() { 
      /* ... x is local for this function ... */ 
     }; 
    })(x); 
} 
0

您需要創建的方法陣列的每個元素的關閉:

for(var x in methods) { 

    buttons[x] = (function(x) { 

     var method = methods[x]; 

     return function() { 
      var data = $('#dialog_'+model+' form').serialize(); 
      data += '&form='+model; 
      $.post(
       $('#dialog_'+model+' form').attr('action')+'method/'+method+'/', 
       data, 
       function(r) { 
         handleFormReturn(r); 
       }, 
       'json' 
      ); 
     }; 
    })(x); 
}