jQuery ajax成功处理程序不修改全局对象

时间:2011-04-27 16:14:09

标签: jquery scope

在下面的代码中,我有一个异步加载应用程序所需文件的函数,当加载所有文件时,我继续执行应用程序:

function loadDATA(){
    var numFILES=6;
    var numLoaded=0;

    var dfd=$.Deferred();
    function fetchJSON(fileName,toObj){
        $.ajax({url: fileName, dataType: 'json',
                success: function(data){
                    if(data){
                        toObj=data;
                    }
                    numLoaded++;
                    if(numLoaded==numFILES){dfd.resolve()};
                }
        });
    }

    fetchJSON(TOCfile,TOC);
    fetchJSON(MAPfile,MAP);
    fetchJSON(CONTENTfile,CONTENT);
    fetchJSON(TABLESfile,TABLES);
    fetchJSON(CAPTIONSfile,CAPTIONS);
    fetchJSON(BOXESfile,BOXES);

    return dfd;
}

对象TOC, MAP, CONTENT, TABLES, CAPTIONS, BOXES全部预先定义为脚本顶部的{}

像这样调用loaDATA:

loadDATA().done(function(){
    //do stuff with all loaded data here
})

一切都按预期工作除了没有为GLOBAL对象分配新值。在success处理程序中,toObj的值为data,但不修改GLOBAL对象。为什么?它与范围有关吗?

感谢您对此提供任何帮助。

1 个答案:

答案 0 :(得分:2)

您正在修改toObj指向的内容,而不是当您说toObj = data时全局指向的内容。

例如,这应该有效:

toObj.data = data;

那是因为你要添加一个新属性。或者,您可以这样:

$.each(data, function(key, value) { 
    toObj[key] = value;
});