簡體   English   中英

訪問外部函數參數而不傳入內部函數

[英]Access outer function param without passing in inner function

我有一個函數,它執行異步調用並在成功時調用匿名函數。匿名函數的data參數用於從服務器收集響應,但它在內部函數內部不可用,除非作為參數傳遞。

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函數內執行,它應該可用嗎?

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

除非這些變量是全局的或者它們在閉包中,否則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.
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM