最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一次圍繞setTimeout的前端面試經(jīng)驗(yàn)分享

 更新時(shí)間:2017年06月15日 10:39:41   作者:Liril  
這篇文章主要跟大家分享了一次圍繞setTimeout展開的前端面試經(jīng)驗(yàn),是一篇有意思的圍繞setTimeout展開的前端開發(fā)考題,考察了for循環(huán)、定時(shí)器setTimeout()、JavaScript閉包、匿名函數(shù)和Promise等,一不小心你可能就會(huì)做錯(cuò),快來看看你有沒有掌握了上面的知識(shí)。

前言

前端這個(gè)近年的熱門領(lǐng)域,搞事氣氛特別強(qiáng)烈,我朋友小偉最近就在瘋狂面試,遇到了許多有趣的面試官,有趣的面試題,我來幫這個(gè)搞事 boy 轉(zhuǎn)述一下。

具體如下:

以下是我一個(gè)朋友的故事,真的不是我。

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

“小偉,你說說這幾行代碼會(huì)輸出什么?”

當(dāng)面試官在 Sublime 打出這幾行代碼時(shí),我竟有點(diǎn)蒙蔽。蛤?這不是最簡單的一個(gè)循環(huán)嗎?是不是有陷阱啊,我思索一下,這好像和我看的那個(gè)閉包的題很像啊,這面試官是不是沒寫完???有毒啊。

“應(yīng)該是直接輸出 0 到 4 吧...”,我弱弱的說到。

“是啊,別緊張,這題沒啥陷阱,我就是隨便寫一下?!?/p>

(Excuse me?面試官你是來搞笑的嗎,嚇?biāo)览献恿耍。?/p>

“那你在看看這幾行代碼會(huì)輸出什么?”

for (var i = 0; i < 5; i++) {
 setTimeout(function() {
 console.log(i);
 }, 1000 * i);
}

額,什么鬼,怎么還不是我背了那么多遍的那道閉包題,讓我想想。 setTimeout 會(huì)延遲執(zhí)行,那么執(zhí)行到 console.log 的時(shí)候,其實(shí) i 已經(jīng)變成 5 了,對,就是這樣,這么簡單怎么可能難到老子。

“應(yīng)該是開始輸出一個(gè) 5,然后每隔一秒再輸出一個(gè) 5,一共 5 個(gè) 5?!?/p>

“對,那應(yīng)該怎么改才能輸出 0 到 4 呢?”

終于到我熟悉的了,加個(gè)閉包就解決了,穩(wěn)!

for (var i = 0; i < 5; i++) {
 (function(i) {
 setTimeout(function() {
  console.log(i);
 }, i * 1000);
 })(i);
}

“很好,那你能說一下,我刪掉這個(gè) i 會(huì)發(fā)生什么嗎?”

for (var i = 0; i < 5; i++) {
 (function() {
 setTimeout(function() {
  console.log(i);
 }, i * 1000);
 })(i);
}

“這樣子的話,內(nèi)部其實(shí)沒有對 i 保持引用,其實(shí)會(huì)變成輸出 5?!?/p>

“很好,那我給你改一下,你看看會(huì)輸出什么?”

for (var i = 0; i < 5; i++) {
 setTimeout((function(i) {
 console.log(i);
 })(i), i * 1000);
}

蛤?什么鬼,這是什么情況,讓我想想。這里給 setTimeout 傳遞了一個(gè)立即執(zhí)行函數(shù)。額,setTimeout 可以接受函數(shù)或者字符串作為參數(shù),那么這里立即執(zhí)行函數(shù)是個(gè)啥呢,應(yīng)該是個(gè) undefined ,也就是說等價(jià)于:

setTimeout(undefined, ...);

而立即執(zhí)行函數(shù)會(huì)立即執(zhí)行,那么應(yīng)該是立馬輸出的。

“應(yīng)該是立馬輸出 0 到 4 吧?!?/p>

“哎喲,不錯(cuò)哦,最后一題,你對 Promise 了解吧?”

“還可以吧...”

“OK,那你試試這道題?!?/p>

setTimeout(function() {
 console.log(1)
}, 0);
new Promise(function executor(resolve) {
 console.log(2);
 for( var i=0 ; i<10000 ; i++ ) {
 i == 9999 && resolve();
 }
 console.log(3);
}).then(function() {
 console.log(4);
});
console.log(5);

WTF?。。。∥蚁腱o靜!

這道題應(yīng)該考察我 JavaScript 的運(yùn)行機(jī)制的,讓我理一下思路。

首先先碰到一個(gè) setTimeout,于是會(huì)先設(shè)置一個(gè)定時(shí),在定時(shí)結(jié)束后將傳遞這個(gè)函數(shù)放到任務(wù)隊(duì)列里面,因此開始肯定不會(huì)輸出 1 。

然后是一個(gè) Promise,里面的函數(shù)是直接執(zhí)行的,因此應(yīng)該直接輸出 2 3 。

然后,Promise 的 then 應(yīng)當(dāng)會(huì)放到當(dāng)前 tick 的最后,但是還是在當(dāng)前 tick 中。

因此,應(yīng)當(dāng)先輸出 5,然后再輸出 4 。

最后在到下一個(gè) tick,就是 1 。

“2 3 5 4 1”

“好滴,等待下一輪面試吧?!?/p>

So easy!媽媽再也不用擔(dān)心我的面試了。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • QML實(shí)現(xiàn)圓環(huán)顏色選擇器

    QML實(shí)現(xiàn)圓環(huán)顏色選擇器

    這篇文章主要為大家詳細(xì)介紹了QML實(shí)現(xiàn)圓環(huán)顏色選擇器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 讓瀏覽器崩潰的12行JS代碼(DoS攻擊分析及防御)

    讓瀏覽器崩潰的12行JS代碼(DoS攻擊分析及防御)

    現(xiàn)在有一段12行的JavaScript代碼,可以讓firefox、chrome、safari瀏覽器崩潰,而且還能讓iphone重啟、安卓閃退,本文作者對于該12行代碼進(jìn)行了分析解讀并且提出了相應(yīng)的防御辦法,歡迎大家一同探討。有需要的朋友們可以參考借鑒。
    2016-10-10
  • webpack 打包壓縮js和css的方法示例

    webpack 打包壓縮js和css的方法示例

    本篇文章主要介紹了webpack 打包壓縮js和css的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • 使用js畫圖之畫切線

    使用js畫圖之畫切線

    這篇文章主要介紹了使用js繪制幾何圖形系列教程中的畫切線篇,非常方便我們好好熟悉理解javascript,推薦給大家
    2015-01-01
  • JavaScript 計(jì)算圖片加載數(shù)量的代碼

    JavaScript 計(jì)算圖片加載數(shù)量的代碼

    先定義一個(gè)圖片的數(shù)組,然后通過image的onload事件來計(jì)算,注意,onload在ie和火狐有所不同。
    2011-01-01
  • 微信小程序使用picker組件出現(xiàn)的問題探究

    微信小程序使用picker組件出現(xiàn)的問題探究

    這篇文章主要介紹了微信小程序自定義可搜索的picker組件,主要包括自定義可搜索的picker組件的代碼以及調(diào)用實(shí)例,這里的搜索框使用的是vant微信小程序組件庫,picker使用的微信小程序的原生組件,需要的朋友可以參考下
    2023-01-01
  • js 遞歸和定時(shí)器的實(shí)例解析

    js 遞歸和定時(shí)器的實(shí)例解析

    本文主要介紹了js遞歸和定時(shí)器的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • 在Google 地圖上實(shí)現(xiàn)做的標(biāo)記相連接

    在Google 地圖上實(shí)現(xiàn)做的標(biāo)記相連接

    這篇文章主要介紹了在Google 地圖上實(shí)現(xiàn)做的標(biāo)記相連接,需要的朋友可以參考下
    2015-01-01
  • js實(shí)現(xiàn)無縫輪播圖插件封裝

    js實(shí)現(xiàn)無縫輪播圖插件封裝

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)無縫輪播圖插件封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • JavaScript生成UUID的五種方法詳解

    JavaScript生成UUID的五種方法詳解

    UUID是一種由算法生成的二進(jìn)制長度為128位的數(shù)字標(biāo)識(shí)符,格式為“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”。本文總結(jié)了五個(gè)JS生成UUID的方法,感興趣的可以了解一下
    2022-06-06

最新評(píng)論

西吉县| 班玛县| 农安县| 开江县| 共和县| 邮箱| 遂川县| 中西区| 呼伦贝尔市| 青河县| 沙湾县| 兴安县| 湖北省| 通河县| 桓仁| 手机| 冕宁县| 湛江市| 中方县| 盘锦市| 阳西县| 郸城县| 黑河市| 宾川县| 江源县| 普安县| 锦州市| 陆川县| 邢台市| 栖霞市| 多伦县| 廉江市| 民丰县| 安达市| 上蔡县| 同仁县| 汾西县| 内黄县| 松潘县| 克拉玛依市| 宝丰县|