首頁  >  文章  >  web前端  >  最新的前端面試經驗--圍繞setTimeout

最新的前端面試經驗--圍繞setTimeout

零下一度
零下一度原創
2017-06-17 10:36:491106瀏覽

這篇文章主要跟大家分享了一次圍繞setTimeout的前端面試經驗,是一篇有意思的圍繞setTimeout展開的前端開發考題,考察了for循環計時器setTimeout()、JavaScript閉包、匿名函數和Promise等,一不小心你可能就會做錯,快來看看你有沒有掌握了上面的知識。

前言

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

具體如下:

以下是我一個朋友的故事,真的不是我。


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

「小偉,你說說這幾行程式碼會輸出什麼?」

當面試官在Sublime 打出這幾行程式碼時,我竟有點蒙蔽。蛤?這不是最簡單的一個循環嗎?是不是有陷阱啊,我思索一下,這好像跟我看的那個閉包的題很像啊,這面試官是不是沒寫完啊?有毒啊。

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

「是啊,別緊張,這題沒啥陷阱,我就是隨便寫一下。」

(Excuse me?面試官你是來搞笑的嗎,嚇死老子了! )

「那你在看看這幾行程式碼會輸出什麼?」


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

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

「應該是開始輸出一個5,然後每隔一秒再輸出一個5,一共5 個5。」

「對,那該怎麼改才能輸出0 到4 呢? 」

終於到我熟悉的了,加個閉包就解決了,穩!


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

「很好,那你能說一下,我刪掉這個i 會發生什麼事嗎?」


##

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

「這樣子的話,內部其實沒有對i 保持

引用,其實會變成輸出5。」

「很好,那我給你改一下,你看看會輸出什麼?什麼鬼,這是什麼情況,讓我想想。這裡給 setTimeout 傳遞了一個立即執行函數。額,setTimeout 可以接受函數或

字串

作為參數,那麼這裡立即執行函數是個啥呢,應該是個undefined ,也就是說等價於:


for (var i = 0; i < 5; i++) {
 setTimeout((function(i) {
 console.log(i);
 })(i), i * 1000);
}
而立即執行函數會立即執行,那麼應該是立刻輸出的。

「應該是立刻輸出0 到4 吧。」


「哎喲,不錯哦,最後一題,你對Promise 了解吧?」

「還可以吧....”

「OK,那你試試這題。 ! ! !我想靜靜!

這題應該要檢視我 JavaScript 的運作機制的,讓我理一下思路。

先碰到一個 setTimeout,所以會先設定一個定時,在定時結束後將傳遞這個函數放到任務佇列裡面,因此開始肯定不會輸出 1 。

然後是一個 Promise,裡面的函數是直接執行的,因此應該直接輸出 2 3 。

然後,Promise 的 then 應當會放到目前 tick 的最後,但還是在目前 tick 中。

因此,應先輸出 5,然後再輸出 4 。

最後在到下一個 tick,就是 1 。

「2 3 5 4 1」

「好滴,等待下一輪面試。」

So easy!媽媽再也不用擔心我的面試了。

以上是最新的前端面試經驗--圍繞setTimeout的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn