Javascript setTimeout()重复操作时出现问题

Javascript setTimeout()重复操作时出现问题,javascript,function,settimeout,Javascript,Function,Settimeout,我有一个变量,它包含一个字符串,我已将该字符串拆分成一个数组,并使用shift()方法将一个字母一次打印到div。我使用了setTimeout重复这个过程并打印出整个字符串。我遇到的问题是,函数重复打印第一个字母,而不移动到字符串中的下一个字母。 我已经使用了我所知道的唯一使用参数setTimeout的方法,但似乎没有任何效果 代码中的问题在哪里 <div id='ltrType'></div> <script> function buildWord(str)

我有一个变量,它包含一个字符串,我已将该字符串
拆分成一个数组,并使用
shift()
方法将一个字母一次打印到
div
。我使用了
setTimeout
重复这个过程并打印出整个字符串。我遇到的问题是,函数重复打印第一个字母,而不移动到字符串中的下一个字母。 我已经使用了我所知道的唯一使用参数setTimeout的方法,但似乎没有任何效果

代码中的问题在哪里

<div id='ltrType'></div>
<script>
function buildWord(str) {
    var arr = str.split('');

    if(arr.length > 0) {
        document.getElementById('ltrType').innerHTML += arr.shift();
    } else {
        clearTimeout(timer);
    }

    //I've tried setTimeoout like this
    timer = setTimeout(buildWord,100,str);

    //and like this
    timer = setTimeout(function(){ buildWord(str); })
}

buildWord('this is another string blah blah blah');

函数构建字(str){
var arr=str.split(“”);
如果(arr.length>0){
document.getElementById('ltrType')。innerHTML+=arr.shift();
}否则{
清除超时(计时器);
}
//我试过像这样设置时间
定时器=设置超时(buildWord,100,str);
//像这样
timer=setTimeout(函数(){buildWord(str);})
}
buildWord('这是另一个字符串废话');

因为每次在方法调用时都要构建初始数组,所以请将其移到外部

function buildWord(str)
{
   var arr = str.split(' ');

   var helper = function buildWordHelper()
   {       
        if(arr.length > 0) {
            document.getElementById('ltrType').innerHTML += arr.shift();
       } else {
            clearTimeout(timer);
       }

       setTimeout(helper, 100);
   }
   setTimeout(helper, 100);
}

buildWord("bla bla1 bla123");

您不断传入
str
,而您移动的是
arr
。所以基本上你每次都要传递相同的字符串,而第一个字符每次都是相同的。相反,要这样做:

function buildWord(arr) {
    if (typeof arr === "string") {
        arr = arr.split('');
    } 
    if (arr.length) {
        document.getElementById('ltrType').innerHTML += arr.shift();
        setTimeout(function () {
            buildWord(arr);
        }, 100);
    }
}

buildWord('this is another string blah blah blah');

因为arr每次都被初始化为相同的值,所以当您传递str时,您会一次又一次地调用buildword。请尝试将其置于函数之外

var arr=null;
var firsttime=0;
function buildWord(str)
{
if(firsttime==0)
{ arr=str.split('');firsttime=1;}
.....
}

str
在不同的调用之间没有变化。它始终是同一个字符串。每次刷新都是从头开始。您的代码不正确
str
是buildWord函数的参数。它不能在函数外部拆分。您的代码假定
str
是在其他地方定义的。哎呀,您是对的,但没有人阻止我也将字符串移到外面。。。编辑,现在它至少可以工作了:)它现在可以工作了,但是这个功能已经没用了。。。它将保持每次“构建”相同的字符串。我假设这个函数可以与任何字符串一起使用:)我们可以创建另一个方法,它接受一个字符串并调用这个函数作为基础函数。。。但是,好吧,我同意,你的方法更好:)对不起,现在还不让我取消否决票。你能再次编辑你的帖子吗?