访问外部函数参数而不传入内部函数

时间:2017-12-27 11:08:42

标签: javascript jquery ajax

我有一个执行异步调用的功能&成功时调用匿名函数。匿名函数的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函数内直接执行匿名函数,它应该可用吗?

2 个答案:

答案 0 :(得分:1)

这个概念基本上很简单,你的formDisplayGrid()函数是回调函数的外部函数,因此它不应该访问该回调函数中的私有变量。但是如果你想要第一种方法工作你将不得不在回调函数中定义函数。

答案 1 :(得分: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.
});