2015-07-19 56 views
1

我有關於下面的代碼的問題。我創建了一個嵌套對象,我想用一條簡短的線條創建它。我從這個answer here得到了主意。我並未計劃將此代碼用於生產。我被警告temp'可能'是一個泄漏。這只是我能夠生成的一個例子。我明白newSeasonstemp被分配到內存中的同一個對象,這就是爲什麼所有這些都是可能的。在單行中動態設置嵌套對象

這是否實際上是造成內存泄漏?

線中的問題是:

var newSeasons = temp = {}; temp[yr] = data; 

可以測試code here

function parseData (yr, stat, data) { 

    // The way I've been taught 
    var oldSeasons = {}; 
    oldSeasons[yr] = data; 
    console.log('The way Ive been taught\n'); 
    console.log(oldSeasons); 


    console.log('\n****************************\n'); 


    // Experimental way 
    var newSeasons = temp = {}; temp[yr] = data; 
    console.log('Experimental way'); 
    console.log(newSeasons); 
} 

var data = { 
    Pos: '1B', 
    Age: '33', 
    G: '116', 
    stat:'batting', 
    yr: '2005', 
    H:'89', 
    R: '42', 
    RBI: '48' 
}; 

parseData(data.yr,data.stat,data); 
+0

@Amine ye對不起,我剛剛意識到我忘了那部分。 –

+1

在你的代碼中,'temp'變成了一個全局變量,在你連接的答案中並不是這種情況。 –

回答

4

既然你不聲明tempvar temp,你實際上是分配給window.temp,即以一個全局變量(假設我們在瀏覽器中談論JS)。除非您明確刪除全局引用或重新分配全局引用,否則不再需要垃圾回收對象。

編輯:本身不是「內存泄漏」:每次調用該函數時,都重用相同的全局引用,因此不會有無用數據逐漸鎖定可用空間的風險。但是,這構成資源的不理想使用。

+2

你是100%正確的,我不會稱之爲「泄漏」,但它是一類稱爲「意外全球」的錯誤。因爲它停留在它將佔用內存,直到頁面被重新加載或者它被設置爲另一個值。 – thomasfuchs

+0

@Amine,謝謝你的回答!我甚至沒有看到。所以通過'newSeasons'聲明'temp',我阻止了創建一個全局變量? 'var newSeasons,temp; newSeasons = temp = {}; temp [yr] = data;' –

+0

@FabianBuentello確實發生了這種情況。當你這樣做的時候,你聲明瞭一個局部變量,一旦功能塊被留下,這個局部變量將不可訪問,導致它所保存的對象被釋放。 –