Javascript全局变量范围/覆盖拼接

时间:2012-04-04 10:57:29

标签: javascript arrays splice

我有一个问题我无法深究,所以任何帮助都会非常感激。

  • 我的scipt顶部我声明了一个全局值('_raw')
  • (使用jQuery)我做了一个Ajax调用,它返回JSON数组数据(我有 检查,JSON数据是否正确)
  • 我接受此JSON响应并将其分配给_raw
  • 当我点击链接时,_raw会传递给某个功能,例如function myFunction(dataArray)myFunction(_raw)
  • 在此功能中,基于一些 标准,dataArray被拼接(即dataArray.splice(2,1)
  • 然后返回
  • dataArray

e.g。

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本身。为什么会这样?

3 个答案:

答案 0 :(得分:2)

数组通过引用传递,因此var data = dataArray执行复制数组。
因此,data.splice(2,1) 修改原始数组。

使用.slice(2,1)复制阵列。
或者,因为您似乎想要获取第二个元素的值,请使用数字索引:

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

答案 1 :(得分:2)

splice()更改原始数组:请参阅http://www.devcurry.com/2010/12/slice-and-splice-in-javascript.html

  

与slice()不同,splice()方法修改原始数组并返回一个新数组。

作为旁注,你并不需要将_raw作为myFunction()的参数传递,因为它是一个全局变量,因此随处可见

答案 2 :(得分:2)

在JavaScript中,数组总是通过引用传递,因此当您将其分配给数据变量时,您只需创建一个指向_raw的指针,所有操作都将在_raw上完成。

您需要复制数组。根据其中的内容以及它是否是多维的,您可能需要使用根据here执行深层复制的方法。