2010-09-15 68 views
3

我有一個全局的JSON變量,我存儲了一些參數,然後每次運行函數時,我都希望能夠修改它們,但只是在本地函數內部。爲什麼函數返回本地JSON變量的值而不是全局?

因此,每次我運行函數時,我都想在本地內部創建全局變量的全新副本。

問題是,我將全局變量複製到函數中定義的局部變量,並且對局部變量進行了更改,但是下次運行該函數時,而不是具有完整副本的全局變量,我有一個我已經修改過的東西。

謝謝! :)

var test = {"name":"me"}; 
function bla() { 
    var t=test; 
    t.name="you"; 
    t.age=55; 
    alert(test.name); // Returns "you" that have been set locally instead of "me" that was global value. 
} 
bla(); 

回答

2

對象由參考分配所以後

var t=test; 

變量ttest指代相同的對象。您需要製作對象的副本以獲取您要查找的行爲。既然你是使用JSON的工作,你可以只序列化原始對象,然後重新解析成一個新的變量,請你

+1

通過JSON克隆一個對象將炸燬任何不可序列化的成員(如函數)。 – 2010-09-15 17:13:19

+0

請閱讀「因爲您正在使用JSON」,請閱讀標題和此問題的正文。只要該對象用於JSON,與編寫自定義遞歸函數相比,對克隆進行序列化和反序列化可能會更快,更不容易出錯。 – MooGoo 2010-09-15 17:27:18

2

var t = test不創建的副本

var t = JSON.parse(JSON.stringify(test)); 

然後修改新對象目的。它只是用另一個名字引用同一個對象。如果要複製的對象,可以考慮使用像jQuery的$.extend()功能:

var t = $.extend({}, test); 

雖然關於這一主題,爲陣列的等同的代碼如下:

var t = test.slice(0); 
2

您的線路

var t=test; 

你不是複製的內容,您正在創建對同一內容的新參考。因此,對t的內容進行任何修改,都會改變測試。

1

到任意對象複製到另一個變量,使用原型函數像這樣的:

Object.prototype.clone = function() { 
    var newObj = (this instanceof Array) ? [] : {}; 
    for (i in this) { 
    if (i == 'clone') continue; 
    if (this[i] && typeof this[i] == "object") { 
     newObj[i] = this[i].clone(); 
    } else newObj[i] = this[i] 
    } return newObj; 
}; 

用法:

var bar = foo.clone(); 

http://my.opera.com/GreyWyvern/blog/show.dml/1725165

相關問題