日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

這一次,徹底解決面試中看代碼說結(jié)果的問題!

來源: 責(zé)編: 時間:2024-05-20 17:56:32 159觀看
導(dǎo)讀Hello,大家好,我是 Sunday。【看代碼說結(jié)果】一直是前端面試中的常見問題。最近在陪幾個同學(xué)面試過程中,幾乎每個中、大廠的面試都會遇到一個或幾個這樣的問題。雖然這樣的問題如此高頻,但是能夠回答好的同學(xué)卻寥寥無幾。

Hello,大家好,我是 Sunday。z2F28資訊網(wǎng)——每日最新資訊28at.com

【看代碼說結(jié)果】一直是前端面試中的常見問題。最近在陪幾個同學(xué)面試過程中,幾乎每個中、大廠的面試都會遇到一個或幾個這樣的問題。z2F28資訊網(wǎng)——每日最新資訊28at.com

陪同學(xué)面試中遇到的真題z2F28資訊網(wǎng)——每日最新資訊28at.com

雖然這樣的問題如此高頻,但是能夠回答好的同學(xué)卻寥寥無幾。z2F28資訊網(wǎng)——每日最新資訊28at.com

每次事后跟同學(xué)溝通,得到的結(jié)果都是:“實際開發(fā)中沒有這么寫的,NND 奇葩面試題!” 大家是不是也會有相同的感受呢?z2F28資訊網(wǎng)——每日最新資訊28at.com

是的!實際開發(fā)中我們肯定不會寫出面試題里的凌亂場景。但是,我們不要忘記,學(xué)習(xí)的目的是:為了拿到更高薪資的 offer!,所以對很多同學(xué)而言 面試 比 實際開發(fā) 更重要! 只有很好的解決了 面試 的問題,大家才可以拿到滿意的 offer。z2F28資訊網(wǎng)——每日最新資訊28at.com

所以,解決【看代碼說結(jié)果】的問題就變得至關(guān)重要了。那么咱們今天,就好好地來聊聊 JS 中的執(zhí)行機制問題,幫大家徹底理解 JS 的執(zhí)行邏輯!z2F28資訊網(wǎng)——每日最新資訊28at.com

關(guān)于 JavaScript 線程基礎(chǔ)邏輯

JavaScript 是一種單線程語言。z2F28資訊網(wǎng)——每日最新資訊28at.com

雖然最新的 HTML5 中引入了 Web Worker,但 JavaScript 單線程的核心保持不變。z2F28資訊網(wǎng)——每日最新資訊28at.com

因此,JavaScript中所有的“多線程”都是用單線程模擬的,JavaScript中的所有多線程都是騙人的!z2F28資訊網(wǎng)——每日最新資訊28at.com

JavaScript 事件循環(huán)

由于 JavaScript 是單線程的,它就像一家只有一個窗口的銀行,客戶需要一一排隊來處理交易。z2F28資訊網(wǎng)——每日最新資訊28at.com

同樣,JavaScript 任務(wù)也需要按順序執(zhí)行,一個接一個。如果一項任務(wù)花費太長時間,則下一項任務(wù)必須等待。z2F28資訊網(wǎng)——每日最新資訊28at.com

那么問題就來了:如果我們想瀏覽新聞,但新聞中的高清圖片加載緩慢,我們的網(wǎng)頁是否要一直卡住,直到圖片完全顯示出來?z2F28資訊網(wǎng)——每日最新資訊28at.com

因此,JS將任務(wù)分為兩類:z2F28資訊網(wǎng)——每日最新資訊28at.com

  • 同步任務(wù)
  • 異步任務(wù)

當(dāng)我們打開一個網(wǎng)站時,網(wǎng)頁的渲染過程由一堆同步任務(wù)組成,例如:骨架屏幕、頁面元素。z2F28資訊網(wǎng)——每日最新資訊28at.com

消耗大量資源且需要很長時間才能完成的任務(wù)(例如:加載圖像、音樂文件)則是異步的。z2F28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片z2F28資訊網(wǎng)——每日最新資訊28at.com

  • 同步和異步任務(wù)進入不同的執(zhí)行“地方”,同步任務(wù)進入主線程,異步任務(wù)進入事件表并注冊函數(shù)。
  • 當(dāng)指定的任務(wù)完成時,事件表會將這個函數(shù)移動到事件隊列中。
  • 主線程內(nèi)的任務(wù)完成后,會從Event Queue中讀取相應(yīng)的函數(shù)并在主線程中執(zhí)行。
  • 上述過程會不斷重復(fù),通常稱為事件循環(huán)。

那么 JS 是如何知道主線程為空的呢?z2F28資訊網(wǎng)——每日最新資訊28at.com

在 JavaScript 引擎有一個監(jiān)控進程,不斷檢查主線程執(zhí)行棧是否為空。一旦為空,它就會去事件隊列檢查是否有任何函數(shù)正在等待調(diào)用。z2F28資訊網(wǎng)——每日最新資訊28at.com

如下面的代碼所示:z2F28資訊網(wǎng)——每日最新資訊28at.com

let data = [];$.ajax({    url:www.lgdsunday.club,    data:data,    success:() => {        console.log('發(fā)送成功!');    }})console.log('代碼執(zhí)行完成');

上面是一個簡單的ajax請求代碼:z2F28資訊網(wǎng)——每日最新資訊28at.com

  • ajax進入事件表并注冊回調(diào)函數(shù)success。
  • 執(zhí)行console. log(‘發(fā)送成功!’)。
  • ajax事件完成,回調(diào)函數(shù)成功進入事件隊列。
  • 主線程success從事件隊列中讀取并執(zhí)行回調(diào)函數(shù)。

通過上面的文字和代碼,大家應(yīng)該對JavaScript中的執(zhí)行順序有了初步的了解了吧。z2F28資訊網(wǎng)——每日最新資訊28at.com

那么接下來咱們來看一個 擾亂執(zhí)行順序的 “元兇” setTimeout。z2F28資訊網(wǎng)——每日最新資訊28at.com

萬惡的 setTimeout

setTimeout 可以延遲執(zhí)行代碼,比如:z2F28資訊網(wǎng)——每日最新資訊28at.com

setTimeout(() => {    task();},3000)console.log('一個普通的打印');

根據(jù)我們之前的結(jié)論,setTimeout是異步的。所以,同步任務(wù)console.log應(yīng)該先執(zhí)行。因此,我們的結(jié)論是:z2F28資訊網(wǎng)——每日最新資訊28at.com

// 一個普通的打印// task()

但是,這里我們要注意 3000 毫秒并不是 task 的執(zhí)行時間,而是 task 進入任務(wù)隊列(主線程)的時間z2F28資訊網(wǎng)——每日最新資訊28at.com

  • 3秒后,計時事件timeout完成。
  • task()進入任務(wù)隊列(主線程)

那么同樣的道理,在面試中常見的 setTimeout(fn, 0) 的延遲 0 毫秒 是什么意思呢?z2F28資訊網(wǎng)——每日最新資訊28at.com

setTimeout(fn ,0)是指定當(dāng)堆棧中的所有同步任務(wù)完成且堆棧變空時,應(yīng)在主線程上最早可用的空閑時間執(zhí)行某個任務(wù),而不需要等待任何額外的秒數(shù)。z2F28資訊網(wǎng)——每日最新資訊28at.com

所以,setTimeout(fn, 0) 并不會立刻執(zhí)行。z2F28資訊網(wǎng)——每日最新資訊28at.com

宏任務(wù)與微任務(wù)

宏任務(wù)與微任務(wù)的概念在這種題目中也是必須要掌握的。z2F28資訊網(wǎng)——每日最新資訊28at.com

  • 宏任務(wù):包括整體腳本代碼、setTimeout、setInterval
  • 微任務(wù):Promise、process.nextTick

事件循環(huán)中事件的順序決定了JavaScript代碼的執(zhí)行順序。z2F28資訊網(wǎng)——每日最新資訊28at.com

  • 輸入整個腳本(宏任務(wù))后,它開始第一個循環(huán)
  • 然后它執(zhí)行所有微任務(wù)。接下來,又從宏任務(wù)開始,直到一個任務(wù)隊列完成后,才再次執(zhí)行所有的微任務(wù)

我們通過一段代碼來看下這個問題:z2F28資訊網(wǎng)——每日最新資訊28at.com

setTimeout(function() {    console.log('setTimeout');})new Promise(function(resolve) {    console.log('promise');}).then(function() {    console.log('then');})console.log('console');
  • 這段代碼作為宏任務(wù),進入主線程。
  • 當(dāng)遇到 setTimeout 時,其回調(diào)函數(shù)被注冊并調(diào)度到宏任務(wù)事件隊列中。 (注冊流程同上,下文不再贅述)。
  • 接下來,當(dāng)遇到 Promise 時,new Promise立即執(zhí)行,并將該then函數(shù)分派到微任務(wù)事件隊列中。
  • 當(dāng)遇到 console.log() 時,立即執(zhí)行。
  • 在將整個腳本作為第一個宏任務(wù)執(zhí)行之后。我們發(fā)現(xiàn)它 then 位于微任務(wù)事件隊列中并被執(zhí)行。
  • 第一輪事件循環(huán)結(jié)束。
  • 第二輪循環(huán)開始;當(dāng)然是從宏任務(wù)Event Queue開始。隊列中對應(yīng)setTimeout的回調(diào)函數(shù)立即被執(zhí)行。
  • 結(jié)尾。

本文鏈接:http://www.www897cc.com/showinfo-26-89413-0.html這一次,徹底解決面試中看代碼說結(jié)果的問題!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 我發(fā)現(xiàn)了大廠OpenApi接口的bug!你發(fā)現(xiàn)了嗎?

下一篇: 入門賽車模擬器新標桿!MOZA 發(fā)布 3.9 牛米伺服直驅(qū)套裝

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 阜南县| 无为县| 宁海县| 东乌| 武安市| 齐齐哈尔市| 清新县| 平和县| 武隆县| 托克托县| 观塘区| 固阳县| 延津县| 兴宁市| 凤庆县| 乌拉特中旗| 东阿县| 浦城县| 泗水县| 新田县| 邵阳县| 祁阳县| 沅江市| 海盐县| 石门县| 右玉县| 平泉县| 弥渡县| 巴塘县| 霍山县| 新宾| 连城县| 黄陵县| 博罗县| 湘西| 车险| 禹城市| 松潘县| 涡阳县| 中方县| 凤凰县|