關(guān)于時間設(shè)置為0的定時器

時間設(shè)置為0時并不會立即執(zhí)行

正確理解setTimeout的方式(注冊事件):
1荔泳、有兩個參數(shù)橙数,第一個參數(shù)是函數(shù)尊流,第二參數(shù)是時間值。
2灯帮、調(diào)用setTimeout時崖技,把函數(shù)參數(shù),放到事件隊列中钟哥。等主程序運行完迎献,再調(diào)用。

for (var i = 0;  i < 3;  i++) {

    setTimeout(function() {
         console.log(i);
    }, 0);

  console.log(i);

}

結(jié)果是:0 1 2 3 3 3
setTimeout(function() {
        console.log(1);
}, 0);
console.log(2);

先打印2腻贰,后打印1吁恍。

事件設(shè)置不為0時,可能并不會按時執(zhí)行

setTimeout(fn, 2000)

我們可以理解為2000之后播演,再放入事件隊列中冀瓦,如果此時隊列為空,那么就直接調(diào)用fn写烤。如果前面還有其他的事件翼闽,那就等待。
因此setTimeout是一個約會從來都不準(zhǔn)時的童鞋洲炊。

巧妙利用這個機(jī)制

我們進(jìn)行dom操作可以先綁定事件感局,然后再去寫其他邏輯尼啡。

setTimeout(function() {
        console.log(i);
}, 0);
var i = 1;

// 1
因為先執(zhí)行vari=1,所以并不會報錯
window.onload = function() {
        fn();
}
var fn = function() {
        alert('hello')
};

這個是一個項目的運用询微,dom加載完成后崖瞭,再獲取節(jié)點,setTimeout是一個宏任務(wù)撑毛,它在事件隊列里排在了script標(biāo)簽這個宏任務(wù)的后面

aaaaa.png

定時器與塊級作用域

但此問題在es6里終結(jié)了读恃,因為es6,發(fā)明了let代态。

for (var i = 0; i < 3; i++) {}
console.log(i);

es5中是沒有塊級作用域的,i可以在for循環(huán)體外訪問到

有關(guān)的面試題目

var i = 0;
setTimeout(function() {
    console.log(i);
}, 0);
console.log(i);
i++;
setTimeout(function() {
    console.log(i);
}, 0);
console.log(i);
i++;
setTimeout(function() {
    console.log(i);
}, 0);
console.log(i);
i++;

根據(jù)前面的理解疹吃,可以把題目轉(zhuǎn)換為

var i = 0;
console.log(i);
i++;
console.log(i);
i++;
console.log(i);
i++;
setTimeout(function() {
    console.log(i);
}, 0);
setTimeout(function() {
    console.log(i);
}, 0);
setTimeout(function() {
    console.log(i);
}, 0);

結(jié)果是0 1 2 3 3 3

定時器與閉包

var fn = function() {
        for (var i = 0; i < 3; i++) {
                setTimeout(function() {
                        console.log(i);
                }, 0);
                console.log(i);
        }
};
fn();

上面的函數(shù)跟我們常見另一個例子(div綁定事件)有什么區(qū)別:

var fn = function() {
        var divs = document.querySelectorAll('div');
        for (var i = 0; i < 3; i++) {
                divs[i].onclick = function() {
                        alert(i);
                };
        }
};
fn();

點擊每個div都會彈出3蹦疑。道理是一樣的。因為alert(i)中的i是fn作用越中的萨驶,因而這是閉包歉摧。
怎么保證能彈出0,1腔呜, 2呢叁温。解決之道:再創(chuàng)建個閉包!核畴!

var fn = function() {
        var divs = document.querySelectorAll('div');
        for (var i = 0; i < 3; i++) {
                divs[i].onclick = (function(i) {
                        return function() {
                                alert(i);
                        };
                })(i);
        }
};
fn();

或者如下的寫法:

var fn = function() {
        var divs = document.querySelectorAll('div');
        for (var i = 0; i < 3; i++) {
                (function(i) {
                        divs[i].onclick = function() {
                                alert(i);
                        };
                })(i);
        }
};
fn();

因此原題如果也想setTimeout也彈出0膝但,1,2的話谤草,改成如下:

for (var i = 0; i < 3; i++) {
    setTimeout((function(i) {
        return function() {
            console.log(i);
        };
    })(i), 0);
    console.log(i);
}

本文章只作為自己的學(xué)習(xí)筆記跟束,如有侵權(quán)行為請聯(lián)系我

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丑孩,隨后出現(xiàn)的幾起案子冀宴,更是在濱河造成了極大的恐慌,老刑警劉巖温学,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件略贮,死亡現(xiàn)場離奇詭異,居然都是意外死亡仗岖,警方通過查閱死者的電腦和手機(jī)逃延,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轧拄,“玉大人真友,你說我怎么就攤上這事〗襞粒” “怎么了盔然?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵桅打,是天一觀的道長。 經(jīng)常有香客問我愈案,道長挺尾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任站绪,我火速辦了婚禮遭铺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恢准。我一直安慰自己魂挂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布馁筐。 她就那樣靜靜地躺著涂召,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敏沉。 梳的紋絲不亂的頭發(fā)上果正,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音盟迟,去河邊找鬼秋泳。 笑死,一個胖子當(dāng)著我的面吹牛攒菠,可吹牛的內(nèi)容都是我干的迫皱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辖众,長吁一口氣:“原來是場噩夢啊……” “哼舍杜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赵辕,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤既绩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后还惠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饲握,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年蚕键,在試婚紗的時候發(fā)現(xiàn)自己被綠了救欧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡锣光,死狀恐怖笆怠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情誊爹,我是刑警寧澤蹬刷,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布瓢捉,位于F島的核電站,受9級特大地震影響办成,放射性物質(zhì)發(fā)生泄漏泡态。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一迂卢、第九天 我趴在偏房一處隱蔽的房頂上張望某弦。 院中可真熱鬧,春花似錦而克、人聲如沸靶壮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腾降。三九已至,卻和暖如春充活,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜡娶。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工混卵, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窖张。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓幕随,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宿接。 傳聞我的和親對象是個殘疾皇子赘淮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354