Javascript setTimeout未在更改DOM之前等待

Javascript setTimeout未在更改DOM之前等待,javascript,settimeout,Javascript,Settimeout,我试图在特定时间后使用setTimeout更改某些类,但我得到的只是即时更改,而无需等待2秒钟。我做错了什么 这是JS function addElements() { var data = ["empty","typeA","typeB","typeC"]; for(var k=0;k<data.length;k++) { var set=document.getElementById("empty"); set.setAttribute("id"

我试图在特定时间后使用setTimeout更改某些类,但我得到的只是即时更改,而无需等待2秒钟。我做错了什么

这是JS

function addElements() {
    var data = ["empty","typeA","typeB","typeC"];
    for(var k=0;k<data.length;k++) {
    var set=document.getElementById("empty");
        set.setAttribute("id", "empty"+k);
        if(data[k] !== "empty") {
            var s = set.setAttribute("class", data[k]);
            setTimeout(function() { s; }, 2000);
        }
        else set.setAttribute("class", data[k]);
}
}
函数加法器(){
变量数据=[“空”、“类型A”、“类型B”、“类型C”];

对于(var k=0;k当您执行
var s=set.setAttribute(“class”,data[k]);
时,您正在运行
setAttribute
函数。因此,您正在设置属性,然后将
s
设置为返回值,即
未定义的

执行
s;
什么都不做。这就是为什么
setTimeout(function(){s;},2000);
实际上什么都不做

您要做的是在
setTimeout
中运行函数。此外,由于这将在循环完成后运行,因此需要通过闭包保存对
k
的引用

var timeoutFunction = function(set, k){
    return function(){
        set.setAttribute("class", data[k]);
    }
};
setTimeout(timeoutFunction(set, k), 2000);

当您执行
var s=set.setAttribute(“class”,data[k]);
时,您正在运行
setAttribute
函数。因此,您正在设置属性,然后将
s
设置为返回值,返回值是
未定义的

执行
s;
什么都不做。这就是为什么
setTimeout(function(){s;},2000);
实际上什么都不做

您要做的是在
setTimeout
中运行函数。此外,由于这将在循环完成后运行,因此需要通过闭包保存对
k
的引用

var timeoutFunction = function(set, k){
    return function(){
        set.setAttribute("class", data[k]);
    }
};
setTimeout(timeoutFunction(set, k), 2000);

这是使用
k

var cName = data[k];
if(cName  !== "empty") {
    (function(set, cName ) {
        setTimeout(function() {
            set.setAttribute("class", cName );
        }, 2000);
    })(set, cName);
}

这是使用
k

var cName = data[k];
if(cName  !== "empty") {
    (function(set, cName ) {
        setTimeout(function() {
            set.setAttribute("class", cName );
        }, 2000);
    })(set, cName);
}


实际上,您的答案是错误的,因为
k
将不是您期望的!当setTimeout运行时,
k
将等于
data.length
。我添加了var s,因为您说我在控制台中得到一个未定义的值,并且不会更改class@epascarello:噢!哇!让我来修。@user2035693:现在试试,我有一个s商场错误!:)谢谢。出于某种原因,@epascarello answer在我不得不做的更改中工作得更好。实际上,你的答案是错误的,因为
k
将不是你所期望的!
k
将等于
data.length
当setTimeout运行时!我添加了var s,因为你说我在控制台中得到了一个未定义的值,而不是ch改变方向class@epascarello:噢!哇!让我来修正。@user2035693:现在试试,我有一个小错误!:)谢谢。出于某种原因,@epascarello answer在我必须做的更改中工作得更好。现在我不再得到一个未定义的值,但在2秒钟后正在更改最后一个div类,即使在控制台cName中也似乎得到了al前2秒后的l值Hoops,也需要传入集合。好的,现在唯一剩下的问题是,它在前2秒后更改所有内容,而不是每次等待2秒cName!=“空”在超时时间之外有一个if语句,这就是问题所在吗?这段代码不会出现这种情况,需要完全不同的逻辑。现在我不再得到一个未定义的值,但在2秒后会更改最后一个div类,即使在控制台中,cName似乎在前2秒之后得到所有值hoops,也需要通过设置。好的,现在唯一剩下的问题是,它在前2秒后更改所有内容,而不是每次cName都等待2秒!==“empty”那么你在超时之外得到了一个if语句,这就是问题所在吗?这个代码不会发生这种情况,需要完全不同的逻辑。