遇到一个好诡异的东西,函数里面居然把外面的变量给影响了$(document).ready(function(){
    var tu = Array(8);
    tu[1] = "img/pt/s/1.jpg";
    tu[2] = "img/pt/s/2.jpg";
    tu[3] = "img/pt/s/3.jpg";
    tu[4] = "img/pt/s/4.jpg";
    tu[5] = "img/pt/s/5.jpg";
    tu[6] = "img/pt/s/6.jpg";
    tu[7] = "img/pt/s/7.jpg";
    tu[8] = "img/pt/s/8.jpg";
    tu[0] = "img/pt/bai.png";/*上面是一个 tu 数组 ,然后我想得到一个新的数组,数组的的内容是打乱了的 tu ,但要保证 tu 还是不变,于是我用了这个函数*/
$.randArray=function(arr0){  
    var arr1=new Array(); 
    var len=arr0.length; 
    for(var i=0;i<len;i++){ 
        var rnd=Math.floor(Math.random()*arr0.length); 
            arr1[i]=arr0[rnd]; 
            arr0.splice(rnd,1);
        } 
   return arr1; 
}alert(tu);/*这个时候,输出 tu 正常*/var tu2=$.randArray(tu);alert(tu);/*这个时候,输出 tu 就空白了*/});上面就是完整的代码了,描述也有一些
后来我到处放alert()来进行排查,发现是在经过函数里面的
arr0.splice(rnd,1);
的时候,tu 的值发生变化的。这个就诡异了啊,函数内部是对形参 arr0 进行操作的,怎么把tu给操作了

解决方案 »

  1.   

    var tu = Array(8);
    你声明了8个长度的数组,
    下面赋值却写了9个。
      

  2.   

    javascript的数据类型除了 数字,字符串,Boolean,undefined,null..这些简单变量,其它的都属于复杂变量,复杂变量在赋值时返回的是一个变量引用,而传参会传一个**引用副本**,而非真实对象本身,
      

  3.   

    我自己找到原因了
     arr0=arr0.splice(rnd,1); 
    应该这里
      

  4.   

    真正的原因还是这里:arr0.splice(rnd,1);splice() 方法会直接对原数组进行修改。而传进来的参数如果是引用,将会修改对象本身。
      

  5.   

    这个不是很正常的么,不诡异啊;
    var tu2=$.randArray(tu); 这个执行完后被arr0.splice(rnd,1)这句把tu数组都删除了;再次输出tu当然就是空了