JS 严格模式和正常模式详解

news2024/10/2 12:35:23

JavaScript 严格模式(Strict Mode)和正常模式(Non-Strict Mode)是用于控制 JavaScript 代码执行的两种不同模式。严格模式引入了一些限制和变化,旨在帮助开发人员编写更可靠、安全和高效的代码。在本文中,我们将详细探讨这两种模式的特点、区别和实例,以帮助您更好地理解它们。

正常模式(Non-Strict Mode)

正常模式是 JavaScript 的默认模式,它在早期版本的 JavaScript 中一直存在。在正常模式下,JavaScript 引擎执行代码时,不会进行额外的限制或错误检查。这意味着在正常模式下,开发人员可以编写更灵活的代码,但也容易引入一些潜在的错误和不安全的行为。

下面是正常模式的一些特点:

1.隐式全局变量:在正常模式下,未使用 var、let 或 const 声明的变量会被视为全局变量。这可能导致变量冲突和不可预测的行为。
2.this 绑定松散:在正常模式下,全局对象的 this 值被视为全局对象自身。这可能导致意外的行为,特别是在函数内部。
3.静默失败:在正常模式下,某些操作会导致静默失败,而不抛出错误。这可能导致开发人员难以诊断和调试问题。
4.变量赋值的宽松规则:正常模式允许在不进行声明的情况下直接赋值给未声明的变量,这可能导致错误的变量名或拼写错误。
5.不严格的语法解析:正常模式下,一些不规范的语法可能被接受,而在严格模式下将被拒绝。

严格模式(Strict Mode)

严格模式是 ECMAScript 5(ES5)中引入的一种更严格的模式,旨在减少常见的编程错误和提高代码质量。在严格模式下,JavaScript 引擎执行代码时会施加额外的限制和错误检查,从而提供更强大的代码分析和更多的运行时错误。

下面是严格模式的一些特点:

1.变量必须声明:在严格模式下,所有变量都必须使用 var、let 或 const 关键字进行声明,否则将抛出错误。这有助于避免意外的全局变量。
2.this 绑定更严格:在严格模式下,函数内部的 this 值不会默认绑定到全局对象,而是为 undefined。这鼓励开发人员明确设置 this 值,减少不确定性。
3.禁止删除变量:在严格模式下,使用 delete 操作符删除变量、函数和函数参数将导致错误。这有助于避免不必要的数据丢失和错误。
4.禁止重复的参数:在严格模式下,函数不允许有重复的参数名,而在正常模式下,重复的参数名不会引发错误。
5.禁止八进制字面量:在严格模式下,八进制字面量(如 0123)将导致错误。在正常模式下,它们将被解释为八进制数。
6.禁止 this 关键字的赋值:在严格模式下,不允许对 this 关键字进行赋值。在正常模式下,这是有效的。
7.保留字作为变量名:在严格模式下,一些保留字(如 arguments 和 eval)不能用作变量名。在正常模式下,这是允许的。
8.禁止对只读属性的赋值:在严格模式下,对只读属性的赋值将导致错误。在正常模式下,这种操作通常不会引发错误。
9.禁止删除不可删除的属性:在严格模式下,使用 delete 操作符删除不可删除的属性将导致错误。在正常模式下,这通常会返回 false,但不会引发错误。
10.更强制的 eval() 行为:在严格模式下,eval() 中的代码无法在其包含的上下文之外创建变量。在正常模式下,它可以创建全局变量。

严格模式 vs. 正常模式:区别和实例

以下是一些示例,说明严格模式和正常模式之间的区别:

变量声明和赋值:

正常模式:

x = 10; // 全局变量 x 被隐式创建

严格模式:

"use strict";
x = 10; // 抛出 ReferenceError:x 未定义

在严格模式下,未声明的变量不能被赋值。

this 绑定:

正常模式:

function doSomething() {
  console.log(this); // 全局对象
}

doSomething();

严格模式:

"use strict";
function doSomething() {
  console.log(this); // undefined
}

doSomething();

在严格模式下,函数内部的 this 不会默认绑定到全局对象。

删除变量:

正常模式:

var x = 10;
delete x; // 返回 true,但 x 未定义

严格模式:

"use strict";
var x = 10;
delete x; // 抛出错误:无法删除

在严格模式下,使用 delete 删除变量将导致错误。

重复的参数名:

正常模式:

function sum(x, x) {
  return x + x;
}

console.log(sum(1, 2)); // 4

严格模式:

"use strict";
function sum(x, x) {
  return x + x;
}

console.log(sum(1, 2)); // 抛出 SyntaxError:参数名重复

在严格模式下,函数不允许有重复的参数名。

八进制字面量:

正常模式:

var num = 0123; // 八进制字面量
console.log(num); // 83

严格模式:

"use strict";
var num = 0123; // 抛出 SyntaxError:八进制字面量无效

在严格模式下,八进制字面量将导致错误。

this 关键字的赋值:

正常模式:

function changeThis() {
  this = 42; // 有效
}

changeThis();

严格模式:

"use strict";
function changeThis() {
  this = 42; // 抛出 TypeError:无法分配给“this”
}

changeThis();

在严格模式下,不允许对 this 关键字进行赋值。

只读属性的赋值:

正常模式:

var obj = {};
Object.defineProperty(obj, "x", { value: 42, writable: false });

obj.x = 10; // 不会报错,但 x 的值不会改变

严格模式:

"use strict";
var obj = {};
Object.defineProperty(obj, "x", { value: 42, writable: false });

obj.x = 10; // 抛出 TypeError:只读属性无法修改

在严格模式下,对只读属性的赋值将导致错误。

删除不可删除的属性:

正常模式:

var obj = {};
Object.defineProperty(obj, "x", { value: 42, configurable: false });

delete obj.x; // 返回 false,但属性未删除

严格模式:

"use strict";
var obj = {};
Object.defineProperty(obj, "x", { value: 42, configurable: false });

delete obj.x; // 抛出 TypeError:无法删除属性

在严格模式下,使用 delete 删除不可删除的属性将导致错误。

保留字作为变量名:

正常模式:

var arguments = 42; // 有效
console.log(arguments); // 42

严格模式:

"use strict";
var arguments = 42; // 抛出 SyntaxError:无法将保留字用作变量名

在严格模式下,一些保留字不能用作变量名。

eval() 行为:

正常模式:

var x = 1;
eval("var x = 2;");
console.log(x); // 2,全局 x 被修改

严格模式:

"use strict";
var x = 1;
eval("var x = 2;");
console.log(x); // 1,全局 x 未被修改

在严格模式下,eval() 中的代码无法在其包含的上下文之外创建变量。

使用严格模式的好处

使用严格模式有助于改善代码质量、降低错误风险并提高性能。以下是一些使用严格模式的好处:

1.更安全的代码:严格模式可以帮助您捕获一些潜在的错误,例如意外的全局变量、不安全的 this 绑定和禁止 eval() 中的变量泄漏。
2.更高效的 JavaScript:严格模式下,引擎可以进行更多的优化,从而提高代码的执行速度。
3.更易维护的代码:严格模式要求更规范的代码编写,更少的潜在陷阱和更明确的行为,从而使代码更容易理解和维护。
4.避免未来的冲突:ECMAScript 规范将来可能会引入新的保留字和语法。使用严格模式可以避免与未来版本的冲突。
5.更好的错误报告:严格模式下,运行时错误更容易捕获,因为它会抛出更多的异常,而不是静默失败。
6.减少全局污染:严格模式可以减少全局变量的污染,因为它要求显式声明变量。

启用严格模式

要在 JavaScript 中启用严格模式,您只需在脚本或函数的顶部添加特定的字符串:

"use strict";

如果您将这个字符串添加到脚本的顶部,整个脚本都将在严格模式下执行。如果您只希望在特定函数内启用严格模式,可以将字符串添加到该函数的顶部。

例如:

"use strict";

function myFunction() {
  // 这里是严格模式
}

function anotherFunction() {
  // 这里不是严格模式
}

严格模式的适用性和最佳实践

尽管严格模式提供了许多好处,但并不是所有情况下都需要使用它。以下是一些使用严格模式的适用性和最佳实践:

  1. 新项目和新代码:对于新项目和新代码,建议启用严格模式,以避免常见的错误和提高代码质量。
    2.旧项目:在旧项目中,启用严格模式可能会导致一些现有代码不起作用。因此,在将严格模式引入现有项目之前,需要进行充分的测试和修复。
    3.特定函数:如果只需要在特定函数内使用严格模式,可以在该函数的顶部启用严格模式,而不必影响整个脚本。
    4.尊重第三方库:在使用第三方库或框架时,应尊重库的规则,不强制启用严格模式。如果库允许,您可以在自己的代码中启用严格模式。
    5.测试和部署:在使用严格模式的代码中,务必进行充分的测试,以确保它正常工作。在部署之前,确保您的代码在严格模式和正常模式下都能正确运行。

总之,JavaScript 严格模式是一个有助于提高代码质量和性能的有用工具。通过了解其特点和使用最佳实践,您可以更好地应用它来编写更可靠和安全的 JavaScript 代码。然而,根据项目的需求和现有的代码基础,您应该权衡是否使用严格模式,以确保最佳的开发和维护体验。
在这里插入图片描述

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

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

相关文章

js实现将文本生成二维码(腾讯云cos)

示例 页面代码 import { getQCodeUrl } from /utils/cosInstance; import { PageContainer } from ant-design/pro-components; import { Access, useAccess } from umijs/max; import { Button, Image } from antd; import { useState } from react;const AccessPage: Reac…

SpringCloud复习:(2)@LoadBalanced注解的工作原理

LoadBalanced注解标记了一个RestTemplate或WebClient bean使用LoadBalancerClient来进行负载均衡。 LoadBalancerAutoConfiguration类给带注解的RestTemplate添加了拦截器:LoadBalancerInterceptor. 具体流程如下: 首先定义一个LoadBalancerInterceptor…

超强满血不收费的AI绘图教程来了(在线Stable Diffusion一键即用)

超强满血不收费的AI绘图教程来了(在线Stable Diffusion一键即用) 一、简介1.1 AI绘图1.2 Stable Diffusion1.2.1 原理简述1.2.2 应用流程 二、AI绘图工具2.1 吐司TusiArt2.2 哩布哩布LibLibAI2.3 原生部署 三、一键即用3.1 开箱尝鲜3.2 模型关联3.3 Cont…

小白必看,手把手教你重装系统

一,安装步骤 二,重装之前需要做的准备 1、重装之前请大家务必注意备份重要资料。电脑有价,数据无价——重要数据备份之后,电脑随便折腾都没问题。大不了就是重装不成功。系统软件问题多试几次总能解决的,但重要数据一…

《红蓝攻防对抗实战》七.常规反弹之利用NC在Linux系统执行反弹shell

目录 一.利用NC工具在linux执行反弹shell 1.Linux正向连接shell 2.利用Linux自带bash反弹Shell 前文推荐: 《红蓝攻防对抗实战》一. 隧道穿透技术详解《红蓝攻防对抗实战》二.内网探测协议出网之TCP/UDP协议探测出网《红蓝攻防对抗实战》三.内网探测协议出网之H…

最新壁纸自动采集系统网站PHP源码/360壁纸官方数据接口采集/ZHEYI采集源码

源码介绍: 最新壁纸自动采集系统网站PHP源码,它是ZHEYI自动采集源码,能够在360壁纸官方数据接口采集。很好用的壁纸网站源码分享,仅供学习,请勿商用。 ZHEYI自动采集壁纸PHP源码,能全自动采集高清壁纸网源…

设计模式—设计模式总览

设计模式—设计模式总览 在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 《Design Patterns - Elements of Reusable Object-Oriented Software》(中文译名:《设计模式 - 可复用的面向对…

Wish如何入驻?最全防封攻略

近日来,跨境电商平台Wish有了新改革,为提高产品质量把控效率,Wish最近将入驻机制又完全开放转变为“邀请制”,加强了品控措施,也意味着商家入驻门槛变高,流程与之前截然不同。但对于已有跨境电商经验/没有跨…

Mybatis 简介(一)

这里使用的是3.5.11版本 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(P…

非连续分配管理方式-基本分页存储管理

非连续分配-可为用户进程分配分散的内存空间 一、存储过程 1.将内存空间分成大小相等的分区,每个分区为一个页框/页帧(内存块/物理块/物理页面),每个页框有一个编号(页框号/内存块号/物理块号),从0开始 2.将进程的逻辑地址空间也分为与页框…

在NodeJS中使用npm包实现JS代码混淆加密

使用npm包,在NodeJS中实现JS代码混淆加密 在前后端JS开发过程中,JS代码保护(JS代码混淆加密)是非常重要的一环。 JShaman是一个云端的代码保护Saas平台,可以对JS代码进行混淆、加密、压缩等操作,从而增强…

[极客大挑战 2019]EasySQL

【解题思路】 1.打开靶机链接 2.输入数据进行尝试 输入1,1: 可以在导航栏里面看到username和password的变量。 3.使用万能密码 username:1 or 11# username:任意数据 password:任意数据 …

传统制造业如何转型?什么是智能工厂?

本文将为大家讲解:传统制造业如何转型?什么是智能工厂? 一、传统工业存在哪些痛点 相较于新兴工业,传统工业在当前发展放缓,并受到了一波互联网数字化智能化发展的冲击。 1、低效率和高成本 传统工业通常采用传统的…

C算法:写一个用于找出数组的最大值和最小值的函数

需求&#xff1a; 写一个用于找出数组的最大值和最小值的函数。 示例&#xff1a;int array[9] {5, 9, 3, 1, 2, 8, 4, 7, 6}; 该数组最大值的下标为1&#xff0c;最小值的小标为3。 代码实现&#xff1a; #include <stdio.h>int getNum(int *array,int len,int (*…

【JAVA学习笔记】39 - final关键字

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/final_ 一、final关键字基本介绍 final可以修饰类、属性、方法和局部变量&#xff0c; 在某些情况下&#xff0c;程序员可能有以下需求&#xff0c;就会使用到final 1)当…

C算法:米m 转化 英尺foot和英寸inch

需求&#xff1a; 已知1英尺等于12英寸&#xff0c;如果已知英制长度的英尺foot和英寸inch的值&#xff0c;那么对应的米是(footinch/12)*0.3048&#xff0c;现在&#xff0c;用户输入的是厘米数&#xff0c;那么对应英制长度的英尺和英寸是多少呢? 输入样例&#xff1a; 1…

ITSource 分享 第4期【简洁的问卷调查系统】

项目介绍 本期给大家介绍一个 简洁的问卷的调查系统。 一 业务介绍 本系统分为以下几个模块: 1.登录注册 2.新建问卷 注册登录完成后,即可进入首页 可以创建问卷 目前只有单选&#xff0c;多选&#xff0c;简答三种问题类型&#xff0c;并且可以选择手动结束和自动结束模式。…

【强化学习】07——规划与学习(Dyna-Q)

文章目录 前置知识回顾策略值函数估计&#xff08;Policy Evaluation&#xff09;策略提升&#xff08;Policy Improvement&#xff09; 模型&#xff08;Model&#xff09;规划(Planning)规划与学习(Planning and Learning)Dyna (集成规划、决策和学习&#xff09;Dyna的框架D…

企业使用微信管理系统更安全更高效更智能

. 想快速处理纠纷&#xff0c;不知道员工和客户孰对孰错&#xff1f; 想提高客户满意度&#xff0c;不清楚客服沟通全过程&#xff1f; 想维护公司利益&#xff0c;不了解销售聊了哪些事&#xff1f; 想知道客户流失原因&#xff0c;不确定沟通话术是否专业&#xff1f; …

第56篇-某度旋转验证码v1分析-旋转验证码【2023-10-24】

声明&#xff1a;该专栏涉及的所有案例均为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请私信联系本人删帖&#xff01; 一、网站分析 网址&#xff1a; aHR0cHM6Ly93YXBwYXNzLmJhaWR1Lm…