2012-04-04 33 views
1

我有一個問題,我不能深究,所以任何幫助將不勝感激。Javascript全球變量範圍/覆蓋接頭

  • 我的素文字的我聲明一個全局值(「_raw」)頂部
  • (使用jQuery)我做一個Ajax調用,它返回JSON數組數據(我已經 選中,JSON數據正確)
  • 我藉此JSON響應,並將其分配給_raw
  • 當我點擊一個鏈接,_raw被傳遞給一個函數,如function myFunction(dataArray),調用myFunction(_raw)
  • 在這個函數中,基於一些 標準,dataArray被剪接(即dataArray.splice(2,1)
  • dataArray然後返回。

例如

var _raw; 

// AJAX call sets RAW to an array e.g. Apple, Banana, Pear, Pineapple, Coconut, Raspberry 

myFunction(dataArray){ 
    var data=dataArray; 
    data.splice(2, 1); 
    return data[0]; 
} 


$('a').click(function(){ 

    result = myFunction(_raw); 
    alert(result); 
// First time this is run, returns 'Pear', however, second time, returns 'Coconut'- as if the splice is being performed on _raw as well as myArray/data... 

}); 
  • 我很欣賞上面有一些差的代碼,這更說明問題

我的問題是,據我所看到的,只是時間_raw是設置,是在AJAX調用期間,但是,當函數myFunction被調用時,通過_raw,拼接似乎也會影響_raw本身。這是爲什麼發生?

+0

數組在JavaScript中作爲參考傳遞,因此數組是指針,就像對象,函數等一樣...但是,您可以使用array.slice返回新數組。 – mpm 2012-04-04 11:03:45

回答

2

在JavaScript中,數組總是通過引用傳遞,所以當你將它分配給數據變量,你只是創建一個指向_raw的指針,所有的操作都將在_raw上完成。

您需要對數組進行克隆。根據其中的內容以及它是否是多維的,您可能需要使用根據here進行深層複製的方法。

2

數組通過引用傳遞,所以var data = dataArray不會不是複製數組。
因此,data.splice(2,1)修改原始數組。

使用.slice(2,1)複製數組。
或者,因爲它似乎要獲得秒元素的值,使用數字指標:

function myFunction(dataArray){ 
    return dataArray[2]; 
}