2011-04-27 42 views
0

在我下面的代码,我有一个异步加载所有必需的文件的应用程序的功能,当所有文件都加载我继续应用程序的执行:jQuery的阿贾克斯成功处理程序不修改全局对象

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 
}) 

一切都按预期不同的是全局对象没有被分配的新值。在success处理程序中,toObj的值为data,但GLOBAL对象未被修改。为什么?它是否与范围有关?

感谢您的任何帮助。

回答

2

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

例如,这应该工作:

toObj.data = data; 

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

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

“你什么修改点toObj为” .....这就是我想做的事情我想修改全局对象toObj点,并没有按” t toObj'指向'相应的全局对象?我尝试过在成功处理程序内部扩展对象以及无成功:'toObj = $。extend({},data)'。对不起,如果我误解了一些东西... – ampersand 2011-04-27 16:33:29

+0

而Javascript不会让你这样做。 JavaScript使用一种类似于Java的值传递形式。每个对象变量都是对内存地址的引用。但是,与C或C++不同,您没有语法来说“更改值,而不是这个东西指向的内存地址”。 – 2011-04-27 16:35:05

+0

感谢迈克..是的,这就是我想要在这里做的。看到我上面的编辑..我试图复制一切使用jQuery的extend()函数,但不能这样做。 – ampersand 2011-04-27 16:37:30