js严格模式和非严格模式

好的,这是一个非常基础且重要的概念。我们来详细解析一下 JavaScript 中的严格模式(Strict Mode)和非严格模式(Sloppy Mode)。

可以把它想象成参加一场考试:

  • 非严格模式:就像是开卷、不计时的随堂测验,规则很宽松,写得不那么标准也能得分,老师会尽量“猜测”你的意图。
  • 严格模式:就像是正式的闭卷大考,有严格的规范,任何不符合规则的写法都会被立刻标记为错误,不留任何情面。

1. 什么是严格模式?

严格模式 (Strict Mode) 是在 ECMAScript 5 (ES5) 中引入的一种选择性加入(opt-in)的机制,它为 JavaScript 代码选择了一种更严格、更受限的语法和错误处理规则。

它的本质是让 JavaScript 引擎以一种更“严谨”的方式来解析和执行你的代码,从而提高代码的健壮性和安全性。

非严格模式 (Sloppy Mode) 则是 JavaScript 默认的、向后兼容的、更“宽容”的模式。

2. 为什么需要严格模式?

JavaScript 最初被设计为一门非常宽容的语言,为了让网页在各种意外情况下都能勉强运行(而不是直接崩溃)。但这种宽容性也导致了一些问题:

  • 静默错误 (Silent Errors):一些本该是错误的操作,在非严格模式下不会报错,只会静默失败,这使得调试变得异常困难。
  • 不安全的行为: 某些语法可能存在安全隐患或导致意外的全局变量污染。
  • 阻碍引擎优化: 一些“坏语法”让 JavaScript 引擎难以对代码进行性能优化。
  • 为未来做准备: 禁止一些未来可能被用作新关键字的保留字。

严格模式的诞生就是为了解决这些历史遗留问题。

3. 如何开启严格模式?

开启严格模式非常简单,只需在代码的特定位置添加一个字符串字面量:

"use strict";

根据你放置的位置,它的作用域也不同:

  • 全局严格模式: 将 "use strict"; 放在脚本文件的最顶部

    // my-script.js
    "use strict";// 整个文件都将以严格模式运行
    let x = 10;
    // ...
    
  • 函数内严格模式: 将 "use strict"; 放在函数体的最顶部

    function myStrictFunction() {"use strict";// 只有这个函数内部是以严格模式运行的let y = 20;// ...
    }
    

一个非常重要的现代知识点:

ES6 模块 (import/export)class 的代码块中,严格模式是默认开启的,你无需手动添加 "use strict";。这就是为什么在现代前端框架(如 React, Vue)的开发中,你很少看到这行代码,因为你写的代码基本上都已经是运行在严格模式下的模块了。


4. 严格模式与非严格模式的主要区别

下面是一些最直观和重要的区别,通过代码对比会非常清晰:

a. 禁止意外创建全局变量

这是最经典的区别。

  • 非严格模式:
    function createGlobal() {mistake = "I am a global variable!"; // 忘记写 let/const/var
    }
    createGlobal();
    console.log(window.mistake); // "I am a global variable!" (在浏览器中)
    // 变量泄漏到了全局作用域,这是一个非常危险的副作用。
    
  • 严格模式:
    "use strict";
    function createGlobal() {mistake = "This will cause an error";
    }
    // createGlobal(); // 这一行会直接抛出 ReferenceError,程序会中断
    
    结论:严格模式将一个常见的“静默错误”变成了“抛出错误”,让你能立刻发现问题。
b. 禁止对只读属性或不可扩展对象进行修改
  • 非严格模式:
    const obj = {};
    Object.defineProperty(obj, 'readOnly', { value: 10, writable: false });obj.readOnly = 20; // 尝试修改只读属性
    console.log(obj.readOnly); // 10 (修改静默失败,不会报错)
    
  • 严格模式:
    "use strict";
    const obj = {};
    Object.defineProperty(obj, 'readOnly', { value: 10, writable: false });// obj.readOnly = 20; // 这一行会抛出 TypeError
    
    结论: 严格模式同样将静默失败的操作变成了明确的错误。
c. this 的指向不同

我们在之前的练习中已经遇到过。

  • 非严格模式:
    function showThis() {console.log(this);
    }
    showThis(); // 在浏览器中,会输出全局的 window 对象
    
  • 严格模式:
    "use strict";
    function showThis() {console.log(this);
    }
    showThis(); // 输出 undefined
    
    结论: 严格模式下的 this 行为更安全,避免了意外地污染全局对象。
d. 禁止重复的参数名
  • 非严格模式:
    function sum(a, a, b) { // 不会报错return a + a + b; // 实际上是第二个 a 生效
    }
    console.log(sum(1, 2, 3)); // 2 + 2 + 3 = 7
    
  • 严格模式:
    "use strict";
    // function sum(a, a, b) { // 这一行在代码解析阶段就会抛出 SyntaxError
    //   return a + b;
    // }
    
    结论: 严格模式在语法层面就杜绝了这种不合理的代码。

总结与建议

特性非严格模式 (Sloppy Mode)严格模式 (Strict Mode)
意外全局变量允许,静默创建禁止,抛出 ReferenceError
修改只读属性静默失败禁止,抛出 TypeError
全局函数this指向全局对象 (window)undefined
重复参数名允许(最后一个生效)禁止,抛出 SyntaxError

最终建议:始终使用严格模式!

在今天,你没有任何理由不使用严格模式。它能帮你写出更健壮、更安全、更规范的代码,并且能让你避免很多难以调试的“幽灵bug”。

鉴于现代 JavaScript 的模块和类已经默认开启了严格模式,将 "use strict"; 放在所有非模块化的老脚本的顶部,应该成为你的一个标准习惯。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87058.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

板凳-------Mysql cookbook学习 (十一--------1)

第11章:生成和使用序列 11.0 引言 11.1 创建一个序列列并生成序列值 CREATE TABLE insect ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (id),name VARCHAR(30) NOT NULL,date DATE NOT NULL,origin VARCHAR(30) NOT NULL); 字段说明 ‌id…

Vue3 中 Excel 导出的性能优化与实战指南

文章目录 Vue3 中 Excel 导出的性能优化与实战指南引言:为什么你的导出功能会卡死浏览器?一、前端导出方案深度剖析1.1 xlsx (SheetJS) - 轻量级冠军1.2 exceljs - 功能强大的重量级选手 二、后端导出方案:大数据处理的救星2.1 为什么大数据需…

安卓RecyclerView实现3D滑动轮播效果全流程实战

安卓RecyclerView实现3D滑动轮播效果全流程实战 1. 前言 作为一名学习安卓的人,在接触之前和之后两种完全不同的想法: 好看和怎么实现 当初接触到RecyclerView就觉得这个控件就可以把关于列表的所有UI实现,即便不能,也是功能十分强大 放在现在依然是应用最广的滑动列表控…

电机控制——电机位置传感器零位标定

在有感FOC算法中电机位置是一个重要的输入,电机位置传感器的作用就是测量电机的旋转角度,通常是输出sin(Theta)和cos(Theta)两路模拟信号,根据这两路模拟信号测得电机旋转绝对角度。注意传感器测量的是机械角度,不是电角度。 关于…

生物化学(实验流程) PCR聚合酶链式反应: DNA 凝胶电泳实验原理 实验流程方法 实操建议笔记

凝胶电泳是分子生物学中最常用的技术之一,广泛用于 DNA 片段的可视化、分离与识别。在获取DNA 凝胶电泳相关设备(电泳设备 & DNA样品染料 & 凝胶 & 染料)之后,可以考虑进行电泳操作。 整体电泳操作流程(从…

Python应用指南:利用高德地图API获取公交+地铁可达圈(三)

副标题:基于模型构建器的批处理多份CSV转换为点、线、面图层 在地理信息系统(GIS)的实际应用中,我们经常需要处理大量以表格形式存储的数据,例如人口统计数据、兴趣点(POI)信息和监测站点记录等…

每日算法刷题Day38 6.25:leetcode前缀和3道题,用时1h40min

5. 1749.任意子数组和的绝对值的最大值(中等,学习) 1749. 任意子数组和的绝对值的最大值 - 力扣(LeetCode) 思想 1.给你一个整数数组 nums 。一个子数组 [numsl, numsl1, ..., numsr-1, numsr] 的 和的绝对值 为 abs(numsl numsl1 ... numsr-1 nu…

创客匠人视角下创始人 IP 打造的底层逻辑与实践路径

在知识付费行业蓬勃发展的当下,创始人 IP 已成为连接用户与商业价值的核心纽带。创客匠人创始人老蒋在与行业头部 IP 洪鑫的对话中揭示了一个关键命题:IP 打造的成败,始于发心与理念的根基。从洪鑫教育中心营收超 6000 万的案例来看&#xff…

2022/7 N2 jlpt词汇

気力(きりょく) 清く(きよく) 記録(きろく) 記憶(きおく) 賢い(かしこい) 偉い(えらい) 凄い(すごい) 鋭い&am…

系统性能优化-8 TCP缓冲区与拥塞控制

每个 TCP 连接都有发送缓冲区和接收缓冲区,发送缓冲区存已发送未确认数据和待发送数据,接收缓冲区存接收但是没有被上层服务读取的数据。 # cat /proc/net/sockstat sockets: used 1885 TCP: inuse 537 orphan 0 tw 3 alloc 959 mem 10其中 mem 代表当前…

【前端】vue工程环境配置

环境准备(Windows版本) nodejs安装 (base) PS C:\Users\Administrator> nvm install 18.8.0 (base) PS C:\Users\Administrator> nvm use 18.8.0 Now using node v18.8.0 (64-bit) (base) PS C:\Users\Administrator> npm -v 8.18.0 (base) PS C:\Users\Administrat…

什么是data version control?为什么需要它?它能解决什么问题?

Data Version Control (DVC) 是一个开源工具,专为数据科学和机器学习项目设计。它的核心目标是像 Git 管理代码一样来管理机器学习项目中的数据和模型文件。 简单来说,DVC 是什么? Git for Data & Models: 它扩展了 Git 的功…

简约计生用品商城简介

计生用品商城简介:uniapp结合thinkphp实现的全开源代码, 内置基本功能:1.后台商品excel一键导入 2.分销利润,按照利润加个分红

go中自动补全插件安装-gopls

vscode中安装gopls失败,导致go中代码无提示,无法自动补全引用 环境变量中设置go的代理:setx GOPROXY “https://goproxy.cn,direct”go install golang.org/x/tools/goplslatest

力扣寻找数组中心索引-性能优化思考

如下代码 var pivotIndex function(nums) {// 空数组返回-1if (nums.length 0) return -1// 计算数组总和const totalSum nums.reduce((sum, num) > sum num, 0);let leftSum 0;// 遍历数组查找中心索引for (let i 0; i < nums.length; i) {// 右侧和 总和 - 左侧…

SVN 分支管理(本文以Unity项目为例)

文章目录 1.准备工作2.新建SVN仓库2.拉取远端空 trunk 到Unity项目目录下3.设置忽略&#xff0c;提交unity项目至仓库3.创建分支4.切换分支5.合并分支回主干&#xff08;例如将 trunk_01 合并回 trunk&#xff09;5.删除分支&#xff08;可选&#xff09; 1.准备工作 下载Tort…

数据结构学习day6---流+读写函数+缓冲+定义函数

目录 1.标准io&#xff1b; stdio.h 1.1标准io的概念 1.2Linux操作系统当中IO都是对文件的操作 1.3标准IO&#xff1a;ANSI C 设计的一组用文件IO 封装的操作库函数 2.文件 2.1作用 2.2linux中文件的类型 3.man 5.流: FILE* 5.1流的定义 5.2流的分类 6.c语言文…

互联网医院,正在发生的医疗新变革

随着信息技术的飞速发展&#xff0c;互联网医院作为医疗服务的新形态&#xff0c;正在全球范围内迅速崛起。在中国&#xff0c;这一变革尤为显著&#xff0c;互联网医院不仅改善了医疗服务的可及性和便捷性&#xff0c;还极大地提升了医疗服务的质量和效率。 一、互联网医院的发…

rabbitmq动态创建交换机、队列、动态绑定,销毁

// 缓存已创建的绑定&#xff0c;避免重复声明private final Map<String, Date> createdBindings new ConcurrentHashMap<>(); public void createAndBindQueueToExchange(String type,String clinetId, String routingKey) {String queueName routingKey;lo…

云效代码仓库导入自建gitlab中

登录自建GitLab 在浏览器中输入GitLab访问地址http://192.168.1.111:81/users/sign_in&#xff0c;输入账号和密码登录GitLab服务&#xff0c;如下图&#xff1a; 新建一个空的代码库 按照以下截图顺序&#xff0c;创建一个新的空项目&#xff0c;如下&#xff1a; 克隆镜像 …