2011-04-27 52 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