小白请教一个关于setTimeout的问题?

1.第一种情况,setTimeout的第一个参数写函数名,可以正确执行,并且函数执行有延迟效果

var cards = document.getElementsByClassName('card');

    for(let i=0;i<cards.length;i++){

        setTimeout(show,1000*i);

    }

    //动画

    function show(){

        console.log(new Date());

    }

2.第二种情况,setTimeout的第二个参数函数带参数,可以执行,但是没有延迟效果;

var cards = document.getElementsByClassName('card');

    for(let i=0;i<cards.length;i++){

        setTimeout(show(i),1000*i);

    }

    //动画

    function show(i){

        console.log(new Date());

    }

这是为什么呢?

带参数的写成这样就会有正确的效果


setTime(function(){

    show(i)

},1000*i)

求解答


一只萌萌小番薯
浏览 477回答 4
4回答

蝴蝶不菲

你这个是把show()的返回值当setTimeout的第一个参数执行setTimeout(show,1000*i,i);第三个和之后的都是第一个参数的参数

www说

setTimeout(show(i),1000*i);setTimeout语句执行前,show(i)已经被执行setTimeout函数要求第一个参数为一个函数正确的代码:&nbsp; &nbsp; var cards = document.getElementsByClassName('card');&nbsp; &nbsp; for(let i=0;i<cards.length;i++){&nbsp; &nbsp; &nbsp; &nbsp; setTimeout((function(i){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return function(){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; show(i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }(i)),1000*i);&nbsp; &nbsp; }&nbsp; &nbsp; //动画&nbsp; &nbsp; function show(i){&nbsp; &nbsp; &nbsp; &nbsp; console.log(new Date());&nbsp; &nbsp; }

SMILET

楼上正解,show(i)在setTimeout语句执行前已经被执行了,它已经是一个结果了,所以setTimeout(show(i),1000i);即为setTimeout(一个结果,1000i);自然是没有解的,而打印出来的值其实是show(i)执行的结果,所以自然没有延时效果

Qyouu

settimeout(show(),i) 你这表示是执行函数.是函数自己执行.而不是定时器去调用settimeout(show,i) 这是调用函数. 和传参不传参一点关系没有.settimeout(function(){show();})这是创建个函数去调用.新创建的函数被定时器调用.所有也会有延迟.这就是一个函数调用的问题.仔细思考就明白了
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript