2017-12-27 469 views
3

我有一個函數,它可以在成功時調用一個匿名函數&。匿名函數參數用於收集來自服務器的響應,但它在內部不可用內部函數除非作爲參數傳遞。不通過內部函數訪問外部函數參數

callService('POST', getDataInfo, detailData, function (data) { 
      formDisplayGrid('.accruedGrid', '.accruedTable', 'Total Accrued');//doesn't work. 
      formDisplayGrid(data,'.accruedGrid', '.accruedTable', 'Total Accrued'); //works 
      }); 

callService只是它使用jQuery的AJAX發出呼叫的功能。

function callService(method, url, data, success) { 
     var ajaxObject = { 
      url: url, 
      method: method, 
      dataType: 'json', 
      success: success 
     } 
     if (method == 'POST') { 
      ajaxObject['data'] = data; 
     } 
     jQuery.ajax(ajaxObject); 
    } 

formDisplayGrid函數只是迭代數據集以形成HTML表。

function formDisplayGrid(data, modalSelector, mainGridSelector, totalLabel) {  
    jQuery(modalSelector).modal(); 
    if (typeof data != 'undefined' && data.Code === 200) { 
     var mainGrid = jQuery(mainGridSelector); 
     var tbody = ''; 

     jQuery.each(data['Data']['category'], function (k, v) { 
      //some code here. 
      jQuery.each(v['subcat'], function (k, v) { 
       //some code here. 
      });  
     });  
       //some code here. 
     mainGrid.find('tbody').html(tbody).fadeIn(1200); 
    } 
} 

是,因爲匿名函數在 正在執行jQuery.ajax功能,它應該是可用的,如果匿名函數直接的callService函數中執行,這是怎麼回事?

+1

請分享formDisplayGrid函數代碼也 – orangespark

+0

@orangespark更新 –

+0

我認爲傳遞數據作爲參數的方法更好,因爲它會模塊化你的函數並將它們分離。編寫純函數是更好的方法。 – orangespark

回答

1

的概念基本上是簡單的,你formDisplayGrid()函數是外部函數回調函數,以便它不應該有訪問私有變量在那個回調函數中。但是如果你想要第一種方法工作,你將不得不在回調函數中定義函數。

+0

函數體需要嵌套在內部而不是寫在其他地方。 –

+0

我在最後一行中提到過:) – orangespark

0

您的formDisplayGrid函數將無法訪問調用它的任何變量,除非這些變量是全局變量或它們處於閉包中。

編輯:你的函數必須從某個地方得到它的data參數 - 否則怎麼知道什麼數據是?有一個很好的理由,只有第二個工作。

EDIT2:這裏是一個封閉的解決方案:

callService('POST', getDataInfo, detailData, function (data) { 
    function formDisplayGrid(modalSelector, mainGridSelector, totalLabel) { 
     // you no longer need the data variable  
     jQuery(modalSelector).modal(); 
     if (typeof data != 'undefined' && data.Code === 200) { 
      var mainGrid = jQuery(mainGridSelector); 
      var tbody = ''; 

      jQuery.each(data['Data']['category'], function (k, v) { 
      //some code here. 
       jQuery.each(v['subcat'], function (k, v) { 
       //some code here. 
       });  
      });  
       //some code here. 
      mainGrid.find('tbody').html(tbody).fadeIn(1200); 
     } 
    } 
    formDisplayGrid('.accruedGrid', '.accruedTable', 'Total Accrued');//should work. 
}); 
+0

我期待着匿名函數會形成一個閉包,它的參數'data'可以根據閉包法則在'formDisplayGrid'函數內自動提供。 –

+1

爲此formDisplayGrid函數定義應該在回調函數內 – orangespark

+0

@orangespark這意味着內部函數只有在它的主體是嵌套的時候纔會獲得對'data'的訪問,而不是當它被名稱調用時? –