【问题标题】:Javascript Global Variable Scope/Overwriting on SpliceJavascript全局变量范围/覆盖拼接
【发布时间】:2012-05-17 18:23:20
【问题描述】:

我遇到了一个无法解决的问题,因此我们将不胜感激。

  • 在我的 scipt 的顶部,我声明了一个全局值 ('_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 本身。为什么会这样?

【问题讨论】:

  • 数组在 javascript 中作为引用传递,因此数组是指针,如对象、函数等......但是,您可以使用 array.slice 返回一个新数组。

标签: javascript arrays splice


【解决方案1】:

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

您需要对数组进行克隆。根据其中的内容以及它是否是多维的,您可能需要使用一种按照here 进行深层复制的方法。

【讨论】:

    【解决方案2】:

    数组是通过引用传递的,所以var data = dataArray复制数组。
    所以,data.splice(2,1) 修改原始数组。

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

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

    【讨论】:

      【解决方案3】:

      splice()改变原来的数组:见http://www.devcurry.com/2010/12/slice-and-splice-in-javascript.html

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

      作为旁注,您实际上不需要将_raw 作为myFunction() 的参数传递,因为它是一个全局变量,因此在任何地方都可见

      【讨论】:

        猜你喜欢
        • 2011-11-20
        • 2015-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-30
        • 2013-05-27
        相关资源
        最近更新 更多