91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

一次圍繞setTimeout的前端面試經驗分享

發布時間:2020-10-10 21:05:59 來源:腳本之家 閱讀:130 作者:Liril 欄目:web開發

前言

前端這個近年的熱門領域,搞事氣氛特別強烈,我朋友小偉最近就在瘋狂面試,遇到了許多有趣的面試官,有趣的面試題,我來幫這個搞事 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。”

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

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

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

setTimeout(undefined, ...);

而立即執行函數會立即執行,那么應該是立馬輸出的。

“應該是立馬輸出 0 到 4 吧。”

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

“還可以吧...”

“OK,那你試試這道題。”

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!!!!我想靜靜!

這道題應該考察我 JavaScript 的運行機制的,讓我理一下思路。

首先先碰到一個 setTimeout,于是會先設置一個定時,在定時結束后將傳遞這個函數放到任務隊列里面,因此開始肯定不會輸出 1 。

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

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

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

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

“2 3 5 4 1”

“好滴,等待下一輪面試吧。”

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洞口县| 洛宁县| 阜康市| 永济市| 连州市| 阳东县| 固始县| 信阳市| 晋江市| 正定县| 阿坝| 霍城县| 炉霍县| 南阳市| 鄂托克前旗| 阳朔县| 闻喜县| 远安县| 南投县| 五莲县| 和政县| 延寿县| 获嘉县| 潼南县| 北川| 平和县| 伊宁市| 龙泉市| 海丰县| 蒲城县| 楚雄市| 夏河县| 开阳县| 澄迈县| 舒城县| 凉城县| 岢岚县| 吉木萨尔县| 宁武县| 邢台市| 聂拉木县|