JavaScript異常機制與嚴格模式

目錄

JavaScript 異常機制

1. 基本語法:try...catch...finally

2. 拋出異常:throw

3. 錯誤對象屬性

4. 同步代碼的異常處理

5. 異步代碼的異常處理

5.1 回調函數

5.2 Promise

5.3 全局未捕獲的 Promise 錯誤

6. 全局錯誤處理

7. 自定義錯誤與錯誤處理策略

8. 注意事項

9. 總結

JavaScript 嚴格模式與非嚴格模式

一、嚴格模式的核心特性

1.?啟用方式

二、嚴格模式 vs 非嚴格模式的關鍵差異

三、嚴格模式的優點

四、嚴格模式的應用場景

1.?避免全局污染

2.?安全的?this?綁定

3.?防止意外覆蓋只讀屬性

五、非嚴格模式的典型問題

1.?隱式創建全局變量

2.?危險的?eval?作用域

六、總結


JavaScript 異常機制

JavaScript 的異常處理機制允許開發者捕獲和處理運行時錯誤,確保程序在遇到意外情況時能夠優雅地降級或恢復。


1. 基本語法:try...catch...finally

  • try?塊:包裹可能拋出錯誤的代碼。

  • catch?塊:捕獲并處理?try?塊中拋出的異常。

  • finally?塊:無論是否發生異常,最終都會執行(常用于清理資源)。

try {// 可能出錯的代碼throw new Error("出錯了!");
} catch (error) {// 處理錯誤console.error("捕獲到錯誤:", error.message);
} finally {// 清理資源(如關閉文件、釋放內存)console.log("無論如何都會執行");
}

2. 拋出異常:throw

  • 使用?throw?語句手動拋出錯誤,可拋出任意類型(但推薦使用?Error?對象或其子類)。

  • 內置錯誤類型

    • Error:通用錯誤基類。

    • SyntaxError:語法錯誤(如 JSON 解析失敗)。

    • TypeError:類型錯誤(如調用非函數)。

    • RangeError:數值超出有效范圍(如遞歸過深)。

    • ReferenceError:引用未聲明變量。

    • URIError:URI 處理函數使用不當。

    • AggregateError:多個錯誤的集合(如?Promise.any?全部拒絕)。

// 拋出內置錯誤
throw new TypeError("變量類型錯誤");// 自定義錯誤
class NetworkError extends Error {constructor(message) {super(message);this.name = "NetworkError";}
}
throw new NetworkError("網絡請求失敗");

3. 錯誤對象屬性

  • name:錯誤類型(如?"Error",?"TypeError")。

  • message:錯誤描述信息。

  • stack(非標準但廣泛支持):錯誤的調用棧跟蹤。

try {throw new Error("測試錯誤");
} catch (error) {console.log(error.name);    // "Error"console.log(error.message); // "測試錯誤"console.log(error.stack);   // 堆棧跟蹤信息
}

4. 同步代碼的異常處理

  • 同步錯誤:在?try?塊中直接拋出,由?catch?捕獲。

  • 示例

    function divide(a, b) {if (b === 0) throw new Error("除數不能為零");return a / b;
    }try {divide(10, 0);
    } catch (error) {console.error(error.message); // "除數不能為零"
    }

5. 異步代碼的異常處理

5.1 回調函數
  • 錯誤優先回調:Node.js 約定回調函數的第一個參數為錯誤對象。

    const fs = require('fs');
    fs.readFile('file.txt', (err, data) => {if (err) {console.error("讀取文件失敗:", err.message);return;}console.log(data);
    });
5.2 Promise
  • .catch():捕獲 Promise 鏈中的錯誤。

  • async/await:結合?try...catch?處理異步錯誤。

    // Promise.catch()
    fetch('https://api.example.com/data').then(response => response.json()).catch(error => console.error("請求失敗:", error));// async/await + try...catch
    async function fetchData() {try {const response = await fetch('https://api.example.com/data');const data = await response.json();return data;} catch (error) {console.error("請求失敗:", error);}
    }
5.3 全局未捕獲的 Promise 錯誤
  • 瀏覽器:監聽?unhandledrejection?事件。

  • Node.js:監聽?unhandledRejection?事件。

    // 瀏覽器
    window.addEventListener('unhandledrejection', event => {console.error("未處理的 Promise 錯誤:", event.reason);
    });// Node.js
    process.on('unhandledRejection', (reason, promise) => {console.error("未處理的 Promise 錯誤:", reason);
    });

6. 全局錯誤處理

  • 瀏覽器window.onerror?或?window.addEventListener('error')

  • Node.jsprocess.on('uncaughtException')

    // 瀏覽器全局錯誤捕獲
    window.onerror = (message, source, lineno, colno, error) => {console.error("全局錯誤:", message, "發生在", source, "行號:", lineno);
    };// Node.js 全局錯誤捕獲
    process.on('uncaughtException', (error) => {console.error("未捕獲的異常:", error);process.exit(1); // 通常建議終止進程
    });

7. 自定義錯誤與錯誤處理策略

  • 自定義錯誤類:繼承?Error?以區分錯誤類型。

  • 條件捕獲:在?catch?塊中根據錯誤類型處理。

    class ValidationError extends Error {constructor(field, message) {super(message);this.name = "ValidationError";this.field = field;}
    }try {throw new ValidationError("email", "郵箱格式無效");
    } catch (error) {if (error instanceof ValidationError) {console.error(`字段 ${error.field} 驗證失敗: ${error.message}`);} else {console.error("其他錯誤:", error);}
    }

8. 注意事項

  1. 避免過度使用異常:異常適用于意外情況,而非控制流程。

  2. 資源清理:在?finally?或?try...catch?外釋放資源(如關閉數據庫連接)。

  3. 錯誤日志:記錄錯誤信息(如?console.error、日志服務)。

  4. 錯誤傳播:在無法處理錯誤時重新拋出(throw error)。

  5. 性能考量:頻繁拋出異常可能影響性能,需謹慎使用。


9. 總結

機制場景工具/語法注意事項
同步錯誤處理函數內直接拋出錯誤try...catch...finally處理意外情況,避免流程控制
異步錯誤處理Promise、回調函數、async/await.catch()try...catch避免未處理的 Promise 拒絕
全局錯誤捕獲未被捕獲的運行時錯誤window.onerrorprocess.on記錄日志并終止不穩定進程
自定義錯誤區分業務錯誤類型繼承?Error?類提供清晰的錯誤分類和信息

? ?

JavaScript 嚴格模式與非嚴格模式

JavaScript 的?嚴格模式(Strict Mode)?是 ES5 引入的一種受限的代碼執行環境,旨在消除代碼中的靜默錯誤、提高安全性,并為未來版本鋪路。


一、嚴格模式的核心特性

1.?啟用方式
  • 全局啟用:在腳本或函數頂部添加?"use strict";

    "use strict";
    // 整個腳本進入嚴格模式
  • 函數級啟用:在函數體頂部添加?"use strict";

    function strictFunc() {"use strict";// 該函數內部為嚴格模式
    }

二、嚴格模式 vs 非嚴格模式的關鍵差異

特性非嚴格模式嚴格模式示例與說明
未聲明變量賦值自動創建全局變量拋出?ReferenceErrorx = 10;?→ 嚴格模式下報錯,防止全局污染
刪除不可刪除的屬性靜默失敗拋出?TypeErrordelete Object.prototype;?→ 嚴格模式下報錯
重復的函數參數允許重復參數名拋出?SyntaxErrorfunction(a, a) {}?→ 嚴格模式下語法錯誤
八進制字面量允許?0123?表示八進制必須使用?0o123const num = 0123;?→ 嚴格模式下報錯,改用?0o123
eval?和?arguments可被重新賦值視為關鍵字,不可賦值eval = 10;?→ 嚴格模式下報錯
with?語句允許使用拋出?SyntaxErrorwith(obj) { ... }?→ 嚴格模式下語法錯誤
this?默認綁定全局對象(windowundefinedfunction f() { console.log(this); } f();?→ 嚴格模式輸出?undefined
arguments.callee可用拋出?TypeErrorfunction f() { return arguments.callee; }?→ 嚴格模式下報錯
對象字面量重復屬性允許重復屬性名(后者覆蓋前者)拋出?SyntaxErrorconst obj = { a: 1, a: 2 };?→ 嚴格模式下語法錯誤

三、嚴格模式的優點

  1. 更早暴露錯誤:將靜默錯誤轉為顯式拋出(如未聲明變量)。

  2. 優化代碼安全性:防止意外全局變量、限制危險操作(如?eval)。

  3. 優化引擎性能:減少歧義代碼,便于編譯器優化。

  4. 未來兼容性:避免使用未來可能成為語法的保留字(如?interfacelet)。


四、嚴格模式的應用場景

1.?避免全局污染
"use strict";
function init() {count = 10; // ReferenceError: count is not defined
}
init();
2.?安全的?this?綁定
"use strict";
function logThis() {console.log(this); // undefined(非嚴格模式為 window)
}
logThis();
3.?防止意外覆蓋只讀屬性
"use strict";
const obj = {};
Object.defineProperty(obj, 'readOnly', { value: 42, writable: false });
obj.readOnly = 100; // TypeError: Cannot assign to read only property

五、非嚴格模式的典型問題

1.?隱式創建全局變量
function leak() {x = 10; // 非嚴格模式下自動成為 window.x
}
leak();
console.log(window.x); // 10
2.?危險的?eval?作用域
var x = 10;
function test() {eval('var x = 20;'); // 非嚴格模式下修改局部變量console.log(x); // 20(嚴格模式下輸出 10)
}
test();
  • eval()?函數會將傳入的字符串當做 JavaScript 代碼進行執行。?

六、總結

決策因素非嚴格模式嚴格模式
代碼安全性低(隱式錯誤多)高(顯式錯誤提示)
兼容性兼容舊代碼需注意 ES3 特性差異
開發體驗靈活但易出錯規范且易維護
未來兼容性可能逐漸淘汰符合現代標準

建議:所有新項目默認啟用嚴格模式,舊項目逐步遷移。通過?"use strict";?提升代碼質量,減少潛在 Bug。


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

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

相關文章

中廠算法崗面試總結

時間:2025.4.10 地點:上市的電子有限公司 面試流程: 1.由負責人講解公司文化 2,由技術人員講解公司的技術崗位,還有成果 3.帶領參觀各個工作位置,還有場所 4.中午吃飯 5.面試題,閉卷考試…

vue+flask圖書知識圖譜推薦系統

文章結尾部分有CSDN官方提供的學長 聯系方式名片 文章結尾部分有CSDN官方提供的學長 聯系方式名片 關注B站,有好處! 編號: F025 架構: vueflaskneo4jmysql 亮點:協同過濾推薦算法知識圖譜可視化 支持爬取圖書數據,數據超過萬條&am…

MySQL NDB Cluster詳解

MySQL NDB Cluster(MNC) 是MySQL提供的一種分布式數據庫解決方案,旨在提供高可用性、高性能的數據庫服務。它通過 NDB(Network DataBase) 存儲引擎實現了高可用性和分布式存儲,在NDB中,數據通過…

解決華碩主板Z890m下載ubuntu20.04后沒有以太網問題

問題描述: 華碩主板Z890m下載雙系統ubuntu20.04后,發現ubuntu不能打開以太網。 問題原因: 華碩主板的網卡驅動是r8125,而ubuntu20.04的驅動版本是r8169,所以是網卡驅動不匹配造成 解決方案 開機界面按下F2進入BOIS模式&#…

JS里對于集合的簡單介紹

JS的集合 前言一、集合二、基本使用1. 創建集合2. 添加元素3. 刪除元素4. 檢查元素5. 清空集合6. 集合的大小 三、擴展使用1. 遍歷集合2. 從數組創建集合3. 集合的應用場景 四、總結 前言 JS里對于集合的簡單介紹 同數學的集合,有無序性、唯一性 注意:…

pytorch 反向傳播

文章目錄 概念計算圖自動求導的兩種模式 自動求導-代碼標量的反向傳播非標量變量的反向傳播將某些計算移動到計算圖之外 概念 核心:鏈式法則 深度學習框架通過自動計算導數(自動微分)來加快求導。 實踐中,根據涉及號的模型,系統會構建一個計…

Kotlin日常使用函數記錄

文章目錄 前言字符串集合1.兩個集合的差集2.集合轉數組2.1.集合轉基本數據類型數組2.2.集合轉對象數組 Map1.合并Map1.1.使用 操作符1.2.使用 操作符1.3.使用 putAll 方法1.4.使用 merge 函數 前言 記錄一些kotlin開發中,日常使用的函數和方式之類的,…

詳解正則表達式中的?:、?= 、 ?! 、?<=、?<!

1、?: - 非捕獲組 語法: (?:pattern) 作用: 創建一個分組但不捕獲匹配結果,不會將匹配的文本存儲到內存中供后續使用。 優勢: 提高性能和效率 不占用編號(不會影響后續捕獲組的編號) 減少內存使用 // 使用捕獲組 let regex1 /(hell…

【無標題】spark編程

Value類型: 9) distinct ? 函數簽名 def distinct()(implicit ord: Ordering[T] null): RDD[T] def distinct(numPartitions: Int)(implicit ord: Ordering[T] null): RDD[T] ? 函數說明 將數據集中重復的數據去重 val dataRDD sparkContext.makeRDD(Lis…

GPT-2 語言模型 - 模型訓練

本節代碼是一個完整的機器學習工作流程,用于訓練一個基于GPT-2的語言模型。下面是對這段代碼的詳細解釋: 文件目錄如下 1. 初始化和數據準備 設置隨機種子 random.seed(1002) 確保結果的可重復性。 定義參數 test_rate 0.2 context_length 128 tes…

架構師面試(二十九):TCP Socket 編程

問題 今天考察網絡編程的基礎知識。 在基于 TCP 協議的網絡 【socket 編程】中可能會遇到很多異常,在下面的相關描述中說法正確的有哪幾項呢? A. 在建立連接被拒絕時,有可能是因為網絡不通或地址錯誤或 server 端對應端口未被監聽&#x…

HTTP實現心跳模塊

HTTP實現心跳模塊 使用輕量級的cHTTP庫cpp-httplib重現實現HTTP心跳模塊 頭文件HttplibHeartbeat.h #ifndef HTTPLIB_HEARTBEAT_H #define HTTPLIB_HEARTBEAT_H#include <string> #include <thread> #include <atomic> #include <chrono> #include …

openharmony—release—4.1開發環境搭建(踩坑記錄)

環境開發需要分別在window以及ubuntu下進行相應設置 一、window 1.安裝DevEco Device Tool OpenAtom OpenHarmony 二、ubuntu 1.將Ubuntu Shell環境修改為bash ls -l /bin/sh 2.打開終端工具&#xff0c;執行如下命令&#xff0c;輸入密碼&#xff0c;然后選擇No&#xff0…

Go學習系列文章聲明

本次學習是基于B站的視頻&#xff0c;【Udemy高分熱門付費課程】Golang&#xff1a;完整開發者指南&#xff08;基礎知識和高級特性&#xff09;中英文字幕_嗶哩嗶哩_bilibili 本人會嘗試輸出視頻中的內容&#xff0c;如有錯誤歡迎指出 next page: Go installation process

error: RPC failed; HTTP 408 curl 22 The requested URL returned error: 408

在git push時報錯&#xff1a;error: RPC failed; HTTP 408 curl 22 The requested URL returned error: 408 原因&#xff1a;可能是推送的文件太大&#xff0c;要么是緩存不夠&#xff0c;要么是網絡不行。 解決方法&#xff1a; 將本地 http.postBuffer 數值調整到500MB&…

Android.bp中添加條件判斷編譯方式

背景&#xff1a; 馬哥學員朋友以前在vip群里&#xff0c;有問道如何在Android.bp中添加條件判斷&#xff0c;在工作中經常需要一套代碼兼容發貨目標版本&#xff0c;即代碼都是公共的一套&#xff0c;但是需要用這一套代碼集成到各個產品設備上 但是這個產品設備可能面臨比…

swift ui基礎

一個樸實無華的目錄 今日學習內容&#xff1a;1.三種布局&#xff08;可以相互包裹&#xff09;1.1 vstack&#xff08;豎直&#xff09;&#xff1a;先寫的在上面1.1 hstack&#xff08;水平&#xff09;&#xff1a;先寫的在左邊1.1 zstack&#xff08;前后&#xff09;&…

第16屆藍橋杯單片機模擬試題Ⅲ

試題 代碼 sys.h #ifndef __SYS_H__ #define __SYS_H__#include <STC15F2K60S2.H> //sys.c extern unsigned char UI; //界面標志(0濕度界面、1參數界面、2時間界面) extern unsigned char time; //時間間隔(1s~10S) extern bit ssflag; //啟動/停止標志…

Node.js中URL模塊詳解

Node.js 中 URL 模塊全部 API 詳解 1. URL 類 const { URL } require(url);// 1. 創建 URL 對象 const url new URL(https://www.example.com:8080/path?queryvalue#hash);// 2. URL 屬性 console.log(協議:, url.protocol); // https: console.log(主機名:, url.hos…

Java接口性能優化面試問題集錦:高頻考點與深度解析

1. 如何定位接口性能瓶頸&#xff1f;常用哪些工具&#xff1f; 考察點&#xff1a;性能分析工具的使用與問題定位能力。 核心答案&#xff1a; 工具&#xff1a;Arthas&#xff08;在線診斷&#xff09;、JProfiler&#xff08;內存與CPU分析&#xff09;、VisualVM、Prometh…