JavaScript BOM、事件循環

目錄

BOM(瀏覽器對象模型)

一、window?對象

1.?窗口控制

2.?定時器

二、location?對象

三、navigator?對象

四、history?對象

五、screen?對象

六、本地存儲

1.?localStorage

2.?sessionStorage

七、BOM 應用場景

八、總結

JavaScript 執行機制與事件循環

一、JavaScript 執行上下文(Execution Context)

二、事件循環(Event Loop)機制

三、代碼執行順序示例

四、異步操作分類

1.?宏任務(Macrotasks)

2.?微任務(Microtasks)

五、Node.js 與瀏覽器的事件循環差異

六、關鍵總結


BOM(瀏覽器對象模型)

BOM(Browser Object Model)是瀏覽器提供的用于與瀏覽器窗口及環境交互的對象模型。與 DOM(文檔對象模型)不同,BOM 的核心對象是?window,它允許開發者控制瀏覽器的行為(如導航、歷史記錄、屏幕信息等)。


一、window?對象

window?是 BOM 的頂層對象,代表瀏覽器窗口,也是 JavaScript 的全局對象。

1.?窗口控制

方法/屬性說明示例
window.innerWidth視口寬度(不包含滾動條)console.log(window.innerWidth)
window.innerHeight視口高度(不包含滾動條)console.log(window.innerHeight)
window.open(url, name)打開新窗口window.open('https://example.com')
window.close()關閉當前窗口(需用戶操作觸發)window.close()
window.resizeTo(w, h)調整窗口大小window.resizeTo(800, 600)

2.?定時器

方法說明示例
setTimeout(func, delay)延遲執行函數setTimeout(() => alert('Hi'), 1000)
setInterval(func, delay)周期性執行函數setInterval(updateClock, 1000)
clearTimeout(id)清除延遲任務clearTimeout(timerId)
clearInterval(id)清除周期任務clearInterval(intervalId)

二、location?對象

location?包含當前頁面的 URL 信息,并允許操作導航。

1.?常用屬性

屬性說明示例值
location.href完整 URL"https://example.com/path?q=1"
location.protocol協議(http:https:"https:"
location.host主機名和端口"example.com:8080"
location.pathnameURL 路徑"/path"
location.search查詢參數(??后的內容)"?q=1"
location.hash哈希值(#?后的內容)"#section"

2.?常用方法

方法說明示例
location.assign(url)加載新頁面location.assign('new-page.html')
location.reload()重新加載當前頁面location.reload(true)(強制刷新)
location.replace(url)替換當前頁面(無歷史記錄)location.replace('login.html')

三、navigator?對象

navigator?提供瀏覽器和操作系統的信息。

屬性/方法說明示例
navigator.userAgent瀏覽器用戶代理字符串"Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..."
navigator.platform操作系統平臺"Win32""MacIntel"
navigator.language瀏覽器首選語言"zh-CN"
navigator.geolocation地理位置 API(需用戶授權)navigator.geolocation.getCurrentPosition(...)
navigator.clipboard剪貼板操作(讀寫文本/圖片)navigator.clipboard.writeText('Hello')

四、history?對象

history?用于操作瀏覽器會話歷史記錄。

方法/屬性說明示例
history.length歷史記錄條目數console.log(history.length)
history.back()返回上一頁(等同用戶點擊后退)history.back()
history.forward()前進到下一頁history.forward()
history.go(n)跳轉到歷史記錄中的第 n 頁history.go(-2)(后退兩頁)
history.pushState()添加歷史記錄(不刷新頁面)history.pushState({}, '', '/new')
history.replaceState()替換當前歷史記錄(不刷新頁面)history.replaceState({}, '', '/updated')

五、screen?對象

screen?提供用戶屏幕的信息。

屬性說明示例
screen.width屏幕寬度(像素)1920
screen.height屏幕高度(像素)1080
screen.availWidth可用寬度(排除任務欄等)1900
screen.availHeight可用高度1040
screen.colorDepth顏色深度(位)24

六、本地存儲

瀏覽器提供的本地存儲 API(屬于 BOM 的一部分)。

1.?localStorage

  • 持久化存儲:數據長期保留(除非手動清除)。

  • 作用域:同源窗口共享。

  • 方法

    localStorage.setItem('key', 'value'); // 存儲數據
    const value = localStorage.getItem('key'); // 讀取數據
    localStorage.removeItem('key'); // 刪除數據
    localStorage.clear(); // 清空所有數據

2.?sessionStorage

  • 會話級存儲:數據在標簽頁關閉后清除。

  • 作用域:僅當前標簽頁有效。

  • 方法:同?localStorage


七、BOM 應用場景

  1. 頁面跳轉與刷新

    // 跳轉到新頁面
    location.href = 'https://example.com';
    // 刷新當前頁面
    location.reload();
  2. 瀏覽器信息檢測

    // 判斷是否為移動端
    const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent);
  3. 歷史記錄管理

    // 單頁應用(SPA)路由控制
    history.pushState({ page: 1 }, 'Page 1', '/page1');
  4. 屏幕適配

    // 根據屏幕寬度調整布局
    if (window.innerWidth < 768) {document.body.classList.add('mobile-mode');
    }

八、總結

對象核心功能典型用途
window窗口控制、定時器、全局對象調整窗口大小、定時任務
locationURL 操作與頁面導航頁面跳轉、獲取 URL 參數
navigator瀏覽器/設備信息設備檢測、地理位置獲取
history歷史記錄管理單頁應用路由控制
screen屏幕信息獲取響應式布局適配
localStorage本地持久化存儲用戶偏好設置、緩存數據

??


JavaScript 執行機制與事件循環

JavaScript 是單線程語言,但其通過?事件循環(Event Loop)?和?任務隊列(Task Queue)?實現了非阻塞異步執行。


一、JavaScript 執行上下文(Execution Context)

  1. 執行棧(Call Stack)

    • 作用:存儲函數調用信息(先進后出)。

    • 示例

      function a() { b(); }
      function b() { console.log('Hello'); }
      a(); // 執行棧順序:a → b → console.log
  2. 同步任務與異步任務

    • 同步任務:立即執行,阻塞后續代碼。

    • 異步任務:由瀏覽器/Node.js 的 Web API 處理(如?setTimeoutfetch),完成后回調推入任務隊列。


二、事件循環(Event Loop)機制

1.?事件循環流程

  • 步驟

    1. 執行同步代碼,填充執行棧。

    2. 遇到異步任務,交給 Web API 處理。

    3. 執行棧清空后,事件循環檢查任務隊列。

    4. 將隊列中的回調推入執行棧執行。

    5. 重復循環。

  • 可視化流程

    同步代碼 → 執行棧 → Web API → 任務隊列 → 事件循環 → 執行棧

2.?任務隊列類型

隊列類型任務類型優先級
微任務隊列(Microtask Queue)Promise.thenMutationObserverqueueMicrotask
宏任務隊列(Macrotask Queue)setTimeoutsetIntervalI/O、UI 渲染
  • 執行順序

    1. 執行棧清空后,先清空所有微任務。

    2. 執行一個宏任務。

    3. 重復上述過程。


三、代碼執行順序示例

console.log('Start');setTimeout(() => console.log('Timeout'), 0);Promise.resolve().then(() => console.log('Promise 1')).then(() => console.log('Promise 2'));console.log('End');

輸出順序

Start → End → Promise 1 → Promise 2 → Timeout

執行步驟

  1. 同步代碼依次執行,輸出?Start?和?End

  2. setTimeout?回調進入宏任務隊列。

  3. Promise.then?回調進入微任務隊列。

  4. 同步代碼執行完畢,執行所有微任務(Promise 1Promise 2)。

  5. 執行下一個宏任務(Timeout)。


四、異步操作分類

1.?宏任務(Macrotasks)

  • 常見類型

    • setTimeout?/?setInterval

    • I/O 操作(文件讀寫、網絡請求)

    • UI 渲染(瀏覽器)

    • requestAnimationFrame(瀏覽器)

  • 特點:每次事件循環處理一個宏任務。

2.?微任務(Microtasks)

  • 常見類型

    • Promise.then?/?catch?/?finally

    • MutationObserver(瀏覽器)

    • queueMicrotask

  • 特點:在當前宏任務結束后、下一個宏任務開始前執行所有微任務。


五、Node.js 與瀏覽器的事件循環差異

環境事件循環階段微任務執行時機
瀏覽器簡化模型:宏任務 → 微任務 → 渲染 → 宏任務...每個宏任務后清空微任務隊列
Node.js分階段(Timers → Pending → Idle/Prepare → Poll → Check → Close),每階段執行對應宏任務每個階段結束后清空微任務隊列

六、關鍵總結

  1. 單線程非阻塞:通過事件循環和任務隊列實現異步。

  2. 任務優先級:微任務 > 宏任務。

  3. 避免阻塞:長時間同步代碼會阻塞事件循環(如大量計算)。

  4. 應用場景

    • 宏任務:延遲任務、I/O 操作。

    • 微任務:高優先級回調(如 Promise)。

示例:優化長時間任務

// 將耗時任務拆分為多個微任務
function processChunk(data) {queueMicrotask(() => {// 處理數據塊if (data.length > 0) {processChunk(data.slice(100));}});
}
processChunk(largeData);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900122.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900122.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900122.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

k8s運維面試總結(持續更新)

一、你使用的promethues監控pod的哪些指標&#xff1f; CPU使用率 內存使用率 網絡吞吐量 磁盤I/O 資源限制和配額&#xff1a;Prometheus可以監控Pod的資源請求和限制&#xff0c;確保它們符合預設的配額&#xff0c;防止資源過度使用。具體指標如container_spec_cpu_quota用于…

ubuntu20.04升級成ubuntu22.04

命令行 sudo do-release-upgrade 我是按提示輸入y確認操作&#xff0c;也可以遇到配置文件沖突時建議選擇N保留當前配置

Cortex-M? 函數調用的入棧與出棧操作

在 ARM Cortex-M 系列單片機中,普通C函數調用的入棧(壓棧)和出棧操作通常由編譯器編譯后生成的代碼管理,而硬件僅負責部分關鍵操作。以下是詳細分析: 1. 函數調用與返回的核心機制 (1) 硬件自動完成的部分 返回地址的保存: 當通過 BL(Branch with Link)或 BLX 指令調用…

DeepSeek能否用于對話系統(Chatbot)?技術解析與應用實例!

引言&#xff1a;Chatbot 的進化與挑戰 你有沒有發現&#xff0c;現在的AI聊天機器人越來越聰明了&#xff1f;無論是客服助手、智能語音設備&#xff0c;還是社交媒體上的自動回復&#xff0c;Chatbot&#xff08;對話系統&#xff09;已經滲透到我們生活的方方面面。但問題是…

多表查詢的多與一

1.查尋表需要的條件 1.1.首先我們要了解查詢表有哪些 1.1.1.多對一 多對一就是一個年表擁有例外一個表的多條數據 一個表對應立一個表的多條數據&#xff0c;另一個表對應這個表的多條數據 這個點被稱為多對一 1.1.2.多對多 多對多簡單來說就是需要一個中間商 中間商就…

配置文件、Spring日志

SpringBoot配置?件 SpringBoot?持并定義了配置?件的格式, 也在另?個層?達到了規范其他框架集成到SpringBoot的 ?的. 很多項?或者框架的配置信息也放在配置?件 中, ?如: 項?的啟動端? 數據庫的連接信息(包含??名和密碼的設置) 第三?系統的調?密鑰等信息 ?…

嵌入式——Linux系統的使用以及編程練習

目錄 一、Linux的進程、線程概念 &#xff08;一&#xff09;命令控制進程 1、命令查看各進程的編號pid 2、命令終止一個進程pid 二、初識Linux系統的虛擬機內存管理 &#xff08;一&#xff09;虛擬機內存管理 &#xff08;二&#xff09;與STM32內存管理對比 三、Lin…

Springcache+xxljob實現定時刷新緩存

目錄 SpringCache詳解 SpringCache概述 核心原理 接口抽象與多態 AOP動態代理 核心注解以及使用 公共屬性 cacheNames KeyGenerator&#xff1a;key生成器 key condition&#xff1a;緩存的條件&#xff0c;對入參進行判斷 注解 xxl-job詳解 SpringcacheRedis實現…

前端Uniapp接入UviewPlus詳細教程!!!

相信大家在引入UviewPlusUI時遇到很頭疼的問題&#xff0c;那就是明明自己是按照官網教程一步一步的走&#xff0c;為什么到處都是bug呢&#xff1f;今天我一定要把這個讓人頭疼的問題解決了&#xff01; 1.查看插件市場 重點&#xff1a; 我們打開Dcloud插件市場搜素uviewPl…

vector的介紹與代碼演示

由于以后我們寫OJ題時會經常使用到vector&#xff0c;所以我們必不可缺的是熟悉它的各個接口。來為我們未來作鋪墊。 首先&#xff0c;我們了解一下&#xff1a; https://cplusplus.com/reference/vector/ vector的概念&#xff1a; 1. vector是表示可變大小數組的序列容器…

ZLMediaKit 源碼分析——[5] ZLToolKit 中EventPoller之延時任務處理

系列文章目錄 第一篇 基于SRS 的 WebRTC 環境搭建 第二篇 基于SRS 實現RTSP接入與WebRTC播放 第三篇 centos下基于ZLMediaKit 的WebRTC 環境搭建 第四篇 WebRTC學習一&#xff1a;獲取音頻和視頻設備 第五篇 WebRTC學習二&#xff1a;WebRTC音視頻數據采集 第六篇 WebRTC學習三…

【零基礎入門unity游戲開發——2D篇】SortingGroup(排序分組)組件

考慮到每個人基礎可能不一樣&#xff0c;且并不是所有人都有同時做2D、3D開發的需求&#xff0c;所以我把 【零基礎入門unity游戲開發】 分為成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要講解C#的基礎語法&#xff0c;包括變量、數據類型、運算符、…

26信號和槽_自定義信號(1)

Qt 中也允許自定義信號 ①自定義槽函數,非常關鍵.開發中大部分情況都是需要自定義槽函數的. 槽函數&#xff0c;就是用戶觸發某個操作之后,要進行的業務邏輯. ②自定義信號,比較少見.實際開發中很少會需要自定義信號. 信號就對應到用戶的某個操作~ 在 GUI,用戶能夠進行哪些操作…

今天來介紹一下一個簡單,靈活的JavaScrip圖標工具Chart.js

Chart.js 柱形圖 先看效果&#xff1a; 代碼部分&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> <script src"https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/Chart.js/3.7…

Mysql 中的 binlog、redolog、undolog

Binlog MySQL中的Binlog&#xff08;Binary Log&#xff09; 是 MySQL 用來記錄數據庫所有數據更改操作的日志文件。它是 MySQL 數據庫的核心組件之一&#xff0c;廣泛應用于 數據復制、數據恢復 和 故障恢復 等操作中。 Binlog的主要作用&#xff1a; 數據復制&#xff08;…

object中的方法,和String類常用api

Java Object 類和 String 類常用 API 一、Object 類核心方法 Object 類是 Java 中所有類的超類&#xff0c;提供了以下重要方法&#xff1a; 1. 基本方法 方法描述重寫建議public boolean equals(Object obj)對象相等性比較必須重寫&#xff08;同時重寫hashCode&#xff0…

Haskell語言的云安全

Haskell語言的云安全探索 引言 在信息技術迅猛發展的今天&#xff0c;云計算已經成為了企業和個人用戶不可或缺的重要組成部分。然而&#xff0c;隨著云計算的普及&#xff0c;相關的安全問題也日益突顯。云安全不僅涉及數據的安全性、隱私保護&#xff0c;更涵蓋了訪問控制、…

01背包問題的空間優化與邊界處題目解析

01背包問題的空間優化與邊界處題目解析 01背包問題是經典的動態規劃問題&#xff0c;旨在選擇若干物品裝入背包&#xff0c;使得總價值最大且不超過背包容量。每個物品只能選或不選&#xff08;0或1&#xff09;&#xff0c;不可分割。 選和不選是01背包問題最大的特征 例題…

vue3+ts+element-plus 開發一個頁面模塊的詳細過程

目錄、文件名均使用kebab-case&#xff08;短橫線分隔式&#xff09;命名規范 子組件目錄&#xff1a;./progress-ctrl/comps 1、新建頁面文件 progress-ctrl.vue <script setup lang"ts" name"progress-ctrl"></script><template>&l…

Ubuntu上離線安裝ELK(Elasticsearch、Logstash、Kibana)

在 Ubuntu 上離線安裝 ELK(Elasticsearch、Logstash、Kibana)的完整步驟如下: 一.安裝驗證 二.安裝步驟 1. 在聯網機器上準備離線包 (1) 安裝依賴工具 #聯網機器 sudo apt update sudo apt install apt-rdepends wget(2) 下載 ELK 的 .deb 安裝包 #創建目錄將安裝包下載…