为什么我的数组会在Javascript中分离出来?

为什么我的数组会在Javascript中分离出来?,javascript,arrays,recursion,parameters,colors,Javascript,Arrays,Recursion,Parameters,Colors,所以我正在尝试为我的网站进行平滑的颜色渐变。我做了一个函数,它应该可以做到这一点,它看起来甚至可以工作,但我有一个问题,我一点也不理解,我以前也没有见过类似的情况。我在函数中使用递归,并将我更改的颜色传递回要再次更改的函数。我仅在当前颜色与目标颜色匹配时退出。我完全确认的是,当我再次将2个数组传递回函数时,它们会自行分离 例如:在通过之前,startColsAr=[211211211211]。 通过后,startColsAr=['2';'1';'1';',';'2';'1';',';'2';'1

所以我正在尝试为我的网站进行平滑的颜色渐变。我做了一个函数,它应该可以做到这一点,它看起来甚至可以工作,但我有一个问题,我一点也不理解,我以前也没有见过类似的情况。我在函数中使用递归,并将我更改的颜色传递回要再次更改的函数。我仅在当前颜色与目标颜色匹配时退出。我完全确认的是,当我再次将2个数组传递回函数时,它们会自行分离

例如:在通过之前,startColsAr=[211211211211]。 通过后,startColsAr=['2';'1';'1';',';'2';'1';',';'2';'1';'1';'1'](使用分号使阅读更容易)

正如您在下面的函数中所看到的,我在任何地方都没有做任何事情来更改数组的内容。 以下是我的功能:

function transitionOut(startColAr,endColAr, waitTime, interval, page){      
        //change the colors
        for(var i=0;i<3;i++){
            if(startColAr[i]<endColAr[i]){
                startColAr[i]+=interval;

                if(startColAr[i]>endColAr[i]){startColAr[i]=endColAr[i];}

            }else if(startColAr[i]>endColAr[i]){
                startColAr[i]-=interval;

                if(startColAr[i]<endColAr[i]){startColAr[i]=endColAr[i];}
            }
        }

        //var color="rgb("+startColAr[0]+", "+startColAr[1]+", "+startColAr[2]+")";
        var color = "#"+startColAr[0].toString(16)+startColAr[1].toString(16)+startColAr[2].toString(16);
        document.body.style.backgroundColor = color;

        if(startColAr[0]==endColAr[0] && startColAr[1]==endColAr[1] && startColAr[2]==endColAr[2]){
            location.href=page;
        }

        window.setTimeout("transitionOut(\'"+startColAr+"\', \'"+endColAr+"\', \'"+delay+"\', \'"+interval+"\', \'"+page+"\')",waitTime);
    }
window.setTimeout(transitionOut, waitTime, startColAr, endColAr, waitTime, interval, page);
函数转换输出(startColAr、endColAr、waitTime、interval、page){
//换颜色
对于(变量i=0;iendColAr[i]){
startColAr[i]=间隔;

如果(startColAr[i]线路有问题:

window.setTimeout("transitionOut(\'"+startColAr+"\', \'"+endColAr+"\', \'"+delay+"\', \'"+interval+"\', \'"+page+"\')",waitTime);
准备稍后运行的代码时,您正在将数组转换为字符串。根据,使用setTimeout函数的另一种形式可能更容易:

function transitionOut(startColAr,endColAr, waitTime, interval, page){      
        //change the colors
        for(var i=0;i<3;i++){
            if(startColAr[i]<endColAr[i]){
                startColAr[i]+=interval;

                if(startColAr[i]>endColAr[i]){startColAr[i]=endColAr[i];}

            }else if(startColAr[i]>endColAr[i]){
                startColAr[i]-=interval;

                if(startColAr[i]<endColAr[i]){startColAr[i]=endColAr[i];}
            }
        }

        //var color="rgb("+startColAr[0]+", "+startColAr[1]+", "+startColAr[2]+")";
        var color = "#"+startColAr[0].toString(16)+startColAr[1].toString(16)+startColAr[2].toString(16);
        document.body.style.backgroundColor = color;

        if(startColAr[0]==endColAr[0] && startColAr[1]==endColAr[1] && startColAr[2]==endColAr[2]){
            location.href=page;
        }

        window.setTimeout("transitionOut(\'"+startColAr+"\', \'"+endColAr+"\', \'"+delay+"\', \'"+interval+"\', \'"+page+"\')",waitTime);
    }
window.setTimeout(transitionOut, waitTime, startColAr, endColAr, waitTime, interval, page);

我想这条线是你的问题

window.setTimeout("transitionOut(\'"+startColAr+"\', \'"+endColAr+"\', \'"+delay+"\', \'"+interval+"\', \'"+page+"\')",waitTime);
你可能想要像这样的东西

window.setTimeout(transitionOut, waitTime, startColAr, endColAr, waitTime, interval,page,waitTime);

您可以使用字符串文本调用setTimeout,但我认为不建议这样做。

最终值真的是字符串吗?['2';'1';'1';',';'2';'1';'1';',';'2';'1';'1']这意味着您有一堆字符串而不是数字。您发布的代码中没有类似的内容,因此它必须位于代码的其他地方。我向您保证,不是。数组中的所有值在第二次传递时都是数字。当它们开始第二次“迭代”时通过函数,它们不再是数字。我认为它们现在是字符,但我没有检查。顺便说一句,这段代码位于一个文件中,其中这是唯一的函数。我没有外部库,也没有从中读取的JavaScript文件。我的文件和您看到的函数是隔离的。当使用引号语法时,会运行setTimeout,该语法会转换数组to对象。使用window.setTimeout(function(){transitionOut(startColAr,endColAr,etc..)},waitTime)代替。我首先尝试了这样做,我想,再试一次后,它只允许我运行函数一次(它从那一行中得到一个错误,并自动关闭)。我尝试向window.setTimeout添加匿名函数,但这一行也给了我一个错误。当我说error时,我的意思是该函数只是关闭了,没有做我在那一行后面写的任何事情。我意识到我发布的代码有一个错误。在递归调用中,我返回了“delay”,但返回了“delay”不再指定(我更改了名称)。这就是为什么它是“错误”-正在退出。我将其更改为waitTime,它决定在该时间工作。它已完全运行。谢谢。