JavaScript中的严格模式

news2024/12/27 1:38:37

一.什么是严格模式

在ECMAScript5标准中,JavaScript提出了严格模式的概念:

  • 严格模式是一种具有限制性的JavaScript模式,从而使代码隐式脱离了“懒散(sloppy)模式”;
  • 支持严格模式的浏览器在检测到代码中有严格模式时,会以更加严格的方式对代码进行检测和执行。

严格模式对正常的JavaScript语义进行了一些限制:

  • 严格模式通过抛出错误来消除一些原有的静默(silent)错误;
  • 严格模式让JS引擎在执行代码时可以进行更多的优化(不需要对一些特殊的语法进行处理);
  • 严格模式禁用了在ECMAScript未来版本中可能会定义的一些语法。

二.开启严格模式

1.在js文件中开启严格模式

每个文件需要单独开启。

"use strict";
var message='hello world'
console.log(message)

2.对某一个函数开启严格模式

function foo(){
  "use strict";
}
foo()

三.严格模式的限制

严格模式下的严格语法限制:

  • JavaScript被设计为新手开发者更容易上手,所以有时候本来错误语法,被认为也是可以正常别解析的;
  • 但是这种方式可能会留下安全隐患;
  • 在严格模式下,这种失误会被当做错误,以便更快发现和修正。

1.无法意外的创建全局变量

第一种:在全局作用域中

// 1.禁止意外创建全局变量
// message前没有定义使用的var,没有严格模式的时候会默认创建一个全局变量
message = "hello world"
console.log(message);

第二种:在函数作用域中

function foo() {
    // 创建了一个全局的变量age,在严格模式下就是一种语法错误
    age = 20
}
foo()
console.log(age);

上述这两种情况,在没有开启严格模式的时候,都不会报错。

2.严格模式会使引起静默失败(silent fail,注:不报错也没有任何效果)的赋值操作抛出异常

// 严格模式下NaN是不允许被赋值的
NaN = 123
true.name = 'ac'
var obj = { }
// 这个obj对象可以通过下面这个defineProperty函数来定义添加属性
// 不直接在大括号中添加name属性,是因为使用下面这个函数能够更加精准的配置
Object.defineProperty(obj, "name", {
    configurable:false,   // 是否可配置
    writable: false,  // 是否可写
    value:"why"
})

console.log(obj.name);
// 这个name属性开启了不可写,因此它的值是不会被改变的且没有任何错误提示,但是在严格模式下会报错
obj.name = 'kobe'

// 添加了不可配置之后是不能够删除这个属性的,会报错
delete obj.name

3.严格模式下试图删除不可删除的属性

4.严格模式不允许函数参数有相同的名称

function foo(x, y, x) {
    console.log(x,y,x); 
}
foo(10, 20, 30)

结果是打印30,20,30,因为传入的两个相同参数,就表明是重复定义了两个x变量,结果x的值是最后这个赋值覆盖了第一个赋值。如果使用了严格模式,会报错。
在这里插入图片描述

5.不允许0的八进制语法

在很久之前是可以使用一种格式表示八进制var num = 0123,也就是使用0开头的数字表示八进制的数字,在严格模式下是不被允许的。
不过在es6之后可以使用另一种表示方法:

var num = 0x123 // 十六进制
var num1 = 0o123  // 八进制
var num2 = 0b100 // 二进制

6.在严格模式下,不允许使用with

7.在严格模式下,eval不再为上层引用变量

在这里插入图片描述
没有开启严格模式的时候,两个结果都是hello world。

8.严格模式下,this绑定不会默认转成对象

1)严格模式下,自执行函数的(默认绑定的)this绑定会由window变为undefined
未开启严格模式的时候,直接执行函数,它的this是指向window的,但是严格模式下,this绑定显示为undefined。

"use strict"

function foo() {
    console.log(this);
}

foo()    // undefined

2)严格模式下,其他形式的this绑定的指向不变


var obj1 = {
    name: 'wh',
    foo:foo
}
obj.foo()   // 指向obj

但是这种情况是不会对代码编写造成影响的,因为之前编写的代码中,自执行的函数是没有使用this去引用window的,即便使用到了window中的属性,也是直接使用window去引用,例如:window.localStorage.setItem.
3)setTimeout的this
严格模式下,在setTimeout中使用箭头函数的时候,箭头函数不绑定this,因此会到上层作用域中找this的绑定。

setTimeout(() =>{
  console.log(this)   // window 
},1000)

如果将箭头函数换成普通函数,在非严格模式下,打印出来的this是window,但是在严格模式下,与上面情况不一样的是,打印出来的结果依然是window。

setTimeout(function(){
  console.log(this)  // window
},1000)

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

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

相关文章

卡方检验的基本原理详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、卡方检验基本原理1. 1 χ2统计量计算公式1.2 理论频数如何计算?1.3 χ2值的结果如何理解?1.4 χ2检验的自由度如何理解?1.5 χ…

Arduino开发串口控制ESP8266 RGB LED

根据板卡原理RGB三色LED对应引脚:int LEDR12、int LEDG14、int LEDB13;设置串口波特率为115200Serial.begin(115200);源代码如下所示:/*名称:串口控制RGB亮灭实验功能:通过串口输入R、G、B三个字母来点亮对应的LED灯,关…

Java集合进阶——Map

一、Java Map集合详解 Map集合概述和特点 概述: 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 Map接口和Collection接口的不同 Map是双列的,Collection是单列的 Map的键唯一,Collection的子体系Set是唯一的 Map集合的数据结构针对键有…

放假第三天

假期 # 生活 # 水文 咱们继续假期第三天的日常更文,没看上篇的铁子们我把地址贴在下面。 点我 虽然是假期,但我规划已久的睡懒觉流程却是一直执行不下去。这不今天早上八点我就起床了,当然起的早不是为了“卷”,而是吃早餐。说出…

Python操作 JWT(python-jose包)、哈希(passlib包)、用户验证完整流程

一、JWT简介 JWT是什么? JWT 即JSON 网络令牌(JSON Web Tokens)。 JWT(JSON Web Token) 是一种用于在身份提供者和服务提供者之间传递身份验证和授权数据的开放标准。JWT是一个JSON对象,其中包含了被签名的声明。这些声明可以是…

电脑开机出现绿屏错误无法启动怎么办?

电脑开机出现绿屏错误无法启动怎么办?有用户电脑开机的时候,突然出现了屏幕变成绿色的情况,而且上面有很多的错误代码。然后卡在页面上一直无法进入到桌面,重启电脑后依然无效。那么如何去解决这个问题呢?来看看具体的…

Java---Spring---SpringCache

SpringCache入门学习SpringCache介绍SpringCatch常用注解SpringCatch使用1.导入maven坐标2.配置application.yml3.在启动类上加入EnableCaching注解,开启缓存注解功能4.在controller的方法上加入Cacheable,CacheEvict等注解,进行缓存操作缓存穿透定义解决…

【Nginx】入门看这一篇就够啦,nginx 简介、安装、工作原理、工作方式、详解配置文件

目录 1、nginx 简介 2、nginx的工作原理 3、nginx 工作方式 4、nginx 安装 命令行安装 卸载命令 从源码构建 查看版本 测试启动 5、详解nginx配置文件 第一部分:全局块 第二部分:events块 第三部分:http 6、hosts 文件简介 1、…

解析Activity启动-窗口篇

解析Activity启动-窗口篇 在 解析Activity启动 前两篇文章中,我们分别专注于 堆栈 和 生命周期角度大致的过了一遍启动流程,而本篇会着重窗口的创建和显示流程,继续梳理Activity的启动流程 顺着前两篇文章的分析流程,我们知道和 …

DBCO高分子PEG_DBCO-PEG-Lipoic COOH_二苯并环辛炔-聚乙二醇-硫辛酸

DBCO-PEG-Lipoic acid“点击化学"一般由叠氮化物(azide)和炔烃(alkyne)作用形共价键,具有高效稳定,高特异性等优点。反应不受PH影响,能在常温条件下的水中进行,甚至能在活细胞中进行。DBCO…

第十三届蓝桥杯省赛 JAVA A组 - 矩形拼接

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:蓝桥杯题解集合 📝原题地址:付账问题 📣专栏定位:为想参加蓝桥别的小伙伴整理常考算法题解,祝大家…

Python学习中的六个技巧小结

1. 引言 “Beautiful is better than ugly.” 上述为著名的The Zen of Python的第一句话,也是有追求的python开发人员的信条之一。 所以我们的问题来了: 如何编写漂亮的Python代码? 本文重点通过九个示例向大家展示Python中的六个小技巧,以帮…

java后端-servlet超详细入门

java后端介绍今天我正式开始了一个新话题,那就是 Web。目前我主要会介绍后端。作为后端的老大哥 java,也有很多后端框架,比如大家耳熟能详的 spring 等。今天来带大家入门 servlet,不管是学生,刚毕业或是已经工作自学编…

【倍增】魔力小球

今天最后一篇,该睡了,怕猝死QwQ学校OJ上的一道模板题,去年不会做,今年还是不会做嘻嘻,还好最后调出来了,错的原因竟然是题目有歧义这个小球i的i是他喵的小球编号,不是id!出题人是懂出…

Win11的两个实用技巧系列之电脑system占用高的解决办法

Win11 system占用cpu过高是什么原因? Win11电脑system占用高的解决办法Win11 system占用cpu过高是什么原因?Win11系统遇到system占用cpu很高,该怎么解决呢?下面我们就来看看Win11电脑system占用高的解决办法System占用cpu过高导致电脑卡顿&a…

2023年中职网络安全技能竞赛网页渗透(注入版)

竞赛任务书内容 (一)拓扑图 网页渗透 任务环境说明: 服务器场景:Server2121 服务器场景操作系统:未知(封闭靶机) 用户名:未知 密码:未知 1.访问服务器网站目录1,根据页面信息完成条件,将获取到的flag提交; 2.访问服务器网站目录2,根据页面信息完成条件,将获…

学生写字台灯用什么牌子的好?高品质学生台灯品牌推荐

学生写字台灯,很明显就是为学生而设计的,针对学生长时间学习,用眼强度大的特点,这种学生台灯在设计上对灯光的亮度、样式、护眼技术都是很有讲究的,为的就是保护学生眼睛,在一定程度上缓解眼部疲劳的作用。…

进程概念理解

既然要了解计算机的进程,那么就需要先了解一下计算机的底层结构 目录 冯洛伊曼体系结构 操作系统 系统调用接口 进程 PCB task_struct 内容 操作系统如何组织进程 冯洛伊曼体系结构 想了解计算机的底层结构,那么必定绕不开冯洛伊曼体系结构&…

19/365 java 多线程

1. 基础概念 程序:指令集和数据的集合。(静态) 进程:对程序的一次执行。(动态) 对同一个程序,执行两次,那就是两个进程。 进程是系统资源分配的基本单位 线程:一个进程…

gma 1.1.2 (2023.01.14) 更新日志(重大更新:开始支持空间绘图)

重大更新:从本版本开始, gma 逐步 支持空间绘图功能(依赖 matplotlib)! 获取 gma 1.1.2 1、百度网盘: 链接:https://pan.baidu.com/s/1eT2rJRiUDJuJkWeLJNL-cw?pwdb07n 提取码:b…