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.mzph.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…