鍍金池/ 問(wèn)答/網(wǎng)絡(luò)安全  HTML/ 小白請(qǐng)教一個(gè)關(guān)于setTimeout的問(wèn)題?

小白請(qǐng)教一個(gè)關(guān)于setTimeout的問(wèn)題?

1.第一種情況,setTimeout的第一個(gè)參數(shù)寫(xiě)函數(shù)名,可以正確執(zhí)行,并且函數(shù)執(zhí)行有延遲效果
var cards = document.getElementsByClassName('card');
    for(let i=0;i<cards.length;i++){
        setTimeout(show,1000*i);
    }
    //動(dòng)畫(huà)
    function show(){
        console.log(new Date());
    }
2.第二種情況,setTimeout的第二個(gè)參數(shù)函數(shù)帶參數(shù),可以執(zhí)行,但是沒(méi)有延遲效果;
var cards = document.getElementsByClassName('card');
    for(let i=0;i<cards.length;i++){
        setTimeout(show(i),1000*i);
    }
    //動(dòng)畫(huà)
    function show(i){
        console.log(new Date());
    }
這是為什么呢?

帶參數(shù)的寫(xiě)成這樣就會(huì)有正確的效果

setTime(function(){
    show(i)
},1000*i)

求解答

回答
編輯回答
離人歸

關(guān)于第二種情況的解釋是這樣的:
對(duì)于javascript,只有在方法真正執(zhí)行時(shí)才會(huì)讀取所涉及的變量值。像 show(i) 這個(gè)方法的i值并非如你所料的依次傳參為 0、1、2...然后延時(shí)執(zhí)行。實(shí)際發(fā)生的情況是,等延時(shí)結(jié)束開(kāi)始執(zhí)行 show方法時(shí),show方法才取讀取 i 值 ,而此時(shí)它的值應(yīng)該是 cards.length ,結(jié)果出現(xiàn)所有的輸出結(jié)果都會(huì)是相同的值。

徹底理解偏了,樓上 @可好了 的說(shuō)法是正確的。那是執(zhí)行函數(shù)的用法,是立即執(zhí)行的。

2017年4月19日 14:06
編輯回答
若相惜

settimeout(show(),i) 你這表示是執(zhí)行函數(shù).是函數(shù)自己執(zhí)行.而不是定時(shí)器去調(diào)用
settimeout(show,i) 這是調(diào)用函數(shù). 和傳參不傳參一點(diǎn)關(guān)系沒(méi)有.

settimeout(function(){

show();

})

這是創(chuàng)建個(gè)函數(shù)去調(diào)用.新創(chuàng)建的函數(shù)被定時(shí)器調(diào)用.所有也會(huì)有延遲.

這就是一個(gè)函數(shù)調(diào)用的問(wèn)題.仔細(xì)思考就明白了

2017年8月15日 10:28
編輯回答
醉淸風(fēng)

setTimeout的第一個(gè)參數(shù)應(yīng)該是一個(gè)function, 在設(shè)置定時(shí)的時(shí)候首先js解釋器會(huì)去對(duì)show(i)進(jìn)行求值, 在求值的過(guò)程中show的函數(shù)體會(huì)被立即執(zhí)行, 然后console.log的返回值為undefined, 然后

> setTimeout(undefined,1000)
TypeError: "callback" argument must be a function

所以呢, 就會(huì)出現(xiàn)如題的情形

2018年8月12日 04:20
編輯回答
溫衫

一個(gè)很簡(jiǎn)單的答案,setTimeout的第一個(gè)參數(shù)是一個(gè)函數(shù)或者是一個(gè)函數(shù)的引用,在他內(nèi)部,當(dāng)?shù)搅诵枰獔?zhí)行的時(shí)間,它會(huì)調(diào)用第一個(gè)參數(shù)
function setTimeout(fun,time){

如果到了需要執(zhí)行的時(shí)間-->
fun()

如果你傳入一個(gè)fun(),那么在內(nèi)部就是fun()(),如果fun方法沒(méi)有返回值,那么就相當(dāng)于只寫(xiě)了一個(gè)()

}

2018年9月23日 16:27
編輯回答
乖乖噠

你這個(gè)是把show()的返回值當(dāng)setTimeout的第一個(gè)參數(shù)執(zhí)行
setTimeout(show,1000*i,i);第三個(gè)和之后的都是第一個(gè)參數(shù)的參數(shù)

2017年1月9日 14:42
編輯回答
心夠野

show柯里化就行啦~

var cards = document.getElementsByClassName('card')
for (let i = 0; i < cards.length; i++) {
  setTimeout(show(i), 1000 * i)
}
//動(dòng)畫(huà)
function show(i) {
  return function() {
    console.log(new Date())
  }
}
2017年5月20日 16:27
編輯回答
疚幼

樓上正解,show(i)在setTimeout語(yǔ)句執(zhí)行前已經(jīng)被執(zhí)行了,它已經(jīng)是一個(gè)結(jié)果了,所以setTimeout(show(i),1000i);即為setTimeout(一個(gè)結(jié)果,1000i);
自然是沒(méi)有解的,而打印出來(lái)的值其實(shí)是show(i)執(zhí)行的結(jié)果,所以自然沒(méi)有延時(shí)效果

2017年8月12日 14:19
編輯回答
柒槿年

這跟js語(yǔ)法解析有關(guān),js是解釋型語(yǔ)言!在從上到下執(zhí)行中,碰到了show(i),那么就會(huì)立即執(zhí)行這個(gè)函數(shù),所以settTimeout()的第一個(gè)參數(shù)其實(shí)是show()函數(shù)的返回結(jié)果!

2017年12月6日 04:53
編輯回答
放開(kāi)她
setTimeout(show(i),1000*i);

setTimeout語(yǔ)句執(zhí)行前,show(i)已經(jīng)被執(zhí)行

setTimeout函數(shù)要求第一個(gè)參數(shù)為一個(gè)函數(shù)

正確的代碼:

    var cards = document.getElementsByClassName('card');
    for(let i=0;i<cards.length;i++){
        setTimeout((function(i){
            return function(){
                show(i);
            }
        }(i)),1000*i);
    }
    //動(dòng)畫(huà)
    function show(i){
        console.log(new Date());
    }
2018年5月28日 15:00