国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 15:15:52
字體:
來源:轉載
供稿:網友

前言

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

具體如下:

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

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

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

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

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

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

(Excuse me?面試官你是來搞笑的嗎,嚇死老子了?。?/p>

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

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

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

“應該是開始輸出一個 5,然后每隔一秒再輸出一個 5,一共 5 個 5?!?/p>

“對,那應該怎么改才能輸出 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?!?/p>

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

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,那你試試這道題?!?/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);            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 通河县| 望谟县| 荥阳市| 荃湾区| 乐安县| 宜昌市| 保定市| 吉首市| 清远市| 涿州市| 曲麻莱县| 义乌市| 闸北区| 涡阳县| 陆丰市| 八宿县| 利辛县| 汤原县| 阜南县| 泾源县| 安阳市| 吕梁市| 丁青县| 武义县| 旅游| 嘉定区| 沁阳市| 汉中市| 河池市| 宣威市| 吉安县| 江孜县| 荆门市| 东莞市| 南投市| 麻栗坡县| 岳阳县| 抚州市| 敖汉旗| 五指山市| 五大连池市|