JavaScript:严格模式

news2024/9/29 18:09:44

一、理解严格模式

1.1、JavaScript 是一门弱类型语言,为了防止导致不可预测的错误,增加代码规范,为了使编写的代码变得更合理、更安全、更严谨,ECAMscript5 提出了"严格模式",处于严格模式下运行的 JavaScript 代码会遵循更加苛刻的条件。 

1.2、关键字:

"use strict";

1.3、关键字说明:

1、注意区分大小写,必须全部都是小写的
2、注意空格,整个字符串总共10个字符
3、单引号和双引号无所谓,但是需要有引号
4、必须写在作用域的最顶部,注意其具体的位置
5、可以加分号,也可以不加,但是必须是一个字符串

// 正确示例
“use strict”;
// 错误示例
"USE strict";
" use strict ";
"("USE strict").toLowerCase();"

1.4、兼容性

IE10+的浏览器 及其他主流浏览器均支持严格模式。

1.5、开发中使用吗?

问:平时开发使用严格模式吗?

答:平时使用vue工程化项目,其实已经在使用严格模式了。

二、如何开启严格模式

2.1、整个文件开启严格模式

我们平常写代码的时候可能没太注意严格模式和非严格模式,默认情况下,我们编写的 js 代码都是非严格模式的,想要开启严格模式,我们需要在规定的地方添加'use strict'关键词。

<script>
  "use strict";
  console.log("严格模式");
</script>
<script>
  console.log("非严格模式")
</script>

2.2、单个函数开启严格模式

除了给整个脚本文件添加严格模式外,我们还可以只针对某个函数开启严格模式,我们只需要将"use strict"关键词放在函数体的第一行即可。

function strict() {
  "use strict";
  return "严格模式";
}


function notStrict() {
  return "正常模式";
}

三、严格模式的特点

在变量中、在对象中、在函数中。

3.1、变量

3.1.1、严格模式下变量使用前必须要声明

非严格模式

<script>
snow = 'snowball'
console.log(snow)
</script>

浏览器正常打印没有报错

严格模式

<script>
  "use strict"
   snow = "snowball"
   console.log('snow')
</script>

浏览器报错,提示:snow is not defined

 

3.1.2、严格模式下不能使用delete删除变量

非严格模式

<script>
// 变量
	snow = "snowball"
	delete window.snow
	console.log(snow)
</script>

snow is not defined 说明已经删除 

 严格模式

<script>
    // 变量
	 "use strict"
	snow = "snowball"
	delete snow
	console.log(snow)
</script>

3.1.3、无法使用关键词作为变量名

非严格模式

<script>
  // 变量
	//"use strict"
	let implements= "snowball"
	console.log(implements)
</script>

 严格模式

<script>
  // 变量
	"use strict"
	let implements= "snowball"
	console.log(implements)
</script>

3.2、对象

属性描述符,出现不当操作的时候(静默失败,出现报错)

3.2.1、对象属性操作会更加严格

非严格模式

<script>
  //"use strict";
	let obj = {}
  	Object.defineProperty(obj, "name", { value: 'snow', writable: false });
  	obj.name = "snowball"
 	console.log(obj); 
</script>

严格模式

<script>
  "use strict";
	let obj = {}
  	Object.defineProperty(obj, "name", { value: 'snow', writable: false });
  	obj.name = "snowball"
 	console.log(obj); 
</script>

 非严格模式

<script>
	let obj = {}
  	Object.preventExtensions(obj); // 禁止添加属性
  	obj.name = "snow"
  	console.log(obj); 
</script>

严格模式

<script>
	"use strict";
	let obj = {}
  	Object.preventExtensions(obj); // 禁止添加属性
  	obj.name = "snow"
  	console.log(obj); 
</script>

 

3.3、函数

3.3.1、函数参数不能有重名函数

正常情况

//"use strict";
	 function setName(name, name2) {
    		console.log(name, name2)
  	}
  	setName('snow');

 

非严格模式,参数相同

<script>
	//"use strict";
	 function setName(name, name) {
    		console.log(name, name)
  	}
  	setName('snow');
</script>

严格模式

<script>
	"use strict";
	 function setName(name, name) {
    		console.log(name, name)
  	}
  	setName('snow');
</script>

 

3.3.2、函数arguments有限制

3.3.2.1、无法修改arguments

非严格模式

<script>
	//"use strict";
	 function setName(name){
    		arguments = 'snowball'
    		console.log(arguments)
  	}
  	setName('snow');
</script>

 

严格模式

<script>
	"use strict";
	 function setName(name){
    		arguments = 'snowball'
    		console.log(arguments)
  	}
  	setName('snow');
</script>

 

3.3.2.2、不再追踪参数变化

非严格模式

<script>
	//"use strict";
	 function setName(name){
    		arguments = 'snowball'
		console.log(name);
    		console.log(arguments)
  	}
  	setName('snow');
</script>

 

严格模式

<script>
	"use strict";
	 function setName(name){
    		arguments = 'snowball'
		console.log(name);
    		console.log(arguments)
  	}
  	setName('snow');
</script>

 

3.3.2.3、禁止使用arguments.callee

非严格模式

<script>
	//"use strict";
	 function setName(name){
    		arguments.callee();
  	}
  	setName('snow'); // 正常调用,只不过要考虑内存溢出问题
</script>

 

严格模式

<script>
	"use strict";
	 function setName(name){
    		arguments.callee();
  	}
  	setName('snow'); 
</script>

 

3.3.3、函数必须声明在顶层

其实这和 JavaScript 中的块级作用域是比较相符的,在严格模式下,我们不能把函数声明在 if 或者 for 语句中。

非严格模式

<script>
	// "use strict";
  	if (true) {
	 	function setName(name){
    			console.log(name)
  		}
	}
	setName('snow'); 
</script>

 

严格模式

<script>
	"use strict";
  	if (true) {
	 	function setName(name){
    			console.log(name)
  		}
	}
	setName('snow'); 
</script>

 

3.4、禁止使用eval()

eval 一直都是备受大家争议的,它可以直接执行一段代码,这会导致非常多的问题,所以在严格模式下直接禁用它了。

非严格模式

<script>
	//"use strict";
	 function setName(name){
		eval('myname = "snowball"')
    		console.log(myname)
  	}
	setName('snow'); 
</script>

 

严格模式

<script>
	"use strict";
	 function setName(name){
		eval('myname = "snowball"')
    		console.log(myname)
  	}
	setName('snow'); 
</script>

 

3.5、禁止使用width语句

with 语句主要用来扩展作用域链,它也备受争议,因为它无法在编译时确定属性到底属于哪个对象,所以我们目前是不建议使用它,所以严格模式下也直接禁止使用它了。

非严格模式

<script>
  	//"use strict";
	let obj = {
    		name: 'snow'
  	}
  	with (obj) {
    		name = 'snowball';
 	}
 	console.log(obj);
</script>

严格模式

<script>
  	"use strict";
	let obj = {
    		name: 'snow'
  	}
  	with (obj) {
    		name = 'snowball';
 	}
 	console.log(obj);
</script>

3.6、this无法指向全局

使用 bind、apply 等方法修改 this 指向,但是当我们没有显示执行 this 指向时,this 默认会指向全局,在严格模式下这是不允许的。

非严格模式

<script>
	// "use strict";
  	function setName() {
    		console.log('this:' this)
  	}
  	setName.call(null)
</script>

严格模式

<script>
  	"use strict";
  	function setName() {
    		console.log('this:' this)
  	}
  	setName.call(null)
</script>

 3.7、禁止八进制写法

在正常模式下,如果某个整数的第一位是 0,那么表示该数是八进制数,会自动进行转换,但是在严格模式下无法进行有效转换。

非严格模式

<script>
	//"use strict";
  	let snow = 0100
  	console.log(snow)
</script>

严格模式

<script>
	"use strict";
  	let snow = 0100
  	console.log(snow)
</script>

四、再次理解严格模式

严格模式给我们带来了规范,但是同时也给我们带来了一些不便,但是为了未来的发展,我们最好还是按照严格模式的要求来,这样可以最大程度的减少我们出错的机率,也能够让我们的程序能够走得更远。

五、过程记录

记录一:

1、创建项目strict/index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>title</title>
  <head>
  <body>
      // 变量
	  "use strict"
	  snow = "snowball"
	  console.log(snow)
  </body>
</html>

2、http-server启动项目的服务

3、启动后访问页面

4、访问成功

记录二:

vue2项目,,没有开启严格模式也会报错,,

 nuxt3+vue3+ts项目,,没有开启严格模式也会报错,,

 

// vue2项目
let snow = 0100
console.log(snow)

// vue3 + ts项目
let snow = 0100
console.log(snow)

这说明,vue工程化项目,默认已经开启了严格模式,其实是这样的开启了。
如果不想开启,可以在项目中进行配置。

五、欢迎交流指正、关注我、一起学习。

参考链接:

前端 - vue中mounted中 或者说vue这个框架默认是严格模式? - SegmentFault 思否

【全网首发:完结】JS 中的严格模式【 经典前端面试题 】_哔哩哔哩_bilibili

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

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

相关文章

Mybatis 分页插件 PageHelper

Mybatis 分页插件 PageHelper 使用步骤&#xff1a;(不咋好用) 1.导入依赖&#xff1a; <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.3.0</version&g…

《图机器学习》-GNN 《A Single Layer of a GNN》

这里写目录标题一、A Single Layer of a GNN二、Classical GNN Layer1、GCN2、GraphSAGE3、GAT三、GNN Layer in Practice一、A Single Layer of a GNN 单层的神经网络包括两个部分&#xff1a; 消息转换(Message)信息聚合(Aggregation) GNNLayerMessageAggregationGNN\ Laye…

物联网的新应用--触摸物联网

摘要&#xff1a;本文介绍一下触摸物联网的新进展--电子皮肤的物联网应用。还以为物联网的作用领域单单是从现场采集数据或者传输命令到执行设备吗&#xff1f;不&#xff0c;物联网的应用范围远比控制一盏灯大的多。据网上报道&#xff0c;香港城市大学&#xff08;城大&#…

【软件测试面试题】大厂头条:如何定位bug?实际案例拿offer还不简单......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 问题&#xff1a; 用…

【数据结构】二叉树的四种遍历方式——必做题

写在前面学完上一篇文章的二叉树的遍历之后&#xff0c;来尝试下面的习题吧开始做题144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09;94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09;145. 二叉树的后序遍历 - 力扣&#xff08;LeetCode&#xff09…

Git使用笔记

分支branch切换到另一个分支git checkout 你要切换到的分支的名字git checkout master将本地的这个分支branch1和gitee上的branch1进行合并&#xff08;本地的branch1有的&#xff0c;gitee上branch1没有的增加上去&#xff09;git merge branch1git merge 分支的名字查看本地是…

图解LeetCode——剑指 Offer 25. 合并两个排序的链表

一、题目 输入两个递增排序的链表&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 二、示例 2.1> 示例1&#xff1a; 【输入】1->2->4, 1->3->4 【输出】1->1->2->3->4->4 限制&#xff1a; 0 < 链表长度 < 1000 三、…

1、RocketMQ概述

文章目录1 MQ概述1.1 MQ简介1.2 MQ用途1.3 常见MQ产品1.4 MQ常见协议2 RocketMQ概述2.1 RocketMQ简介2.2 RocketMQ发展历程尚硅谷RocketMQ教程-讲师&#xff1a;Reythor雷&#xff08;老雷&#xff09; 我们缺乏的不是知识&#xff0c;而是学而不厌的态度 1 MQ概述 1.1 MQ简介…

实例9:四足机器人运动学正解平面RR单腿可视化

实例9&#xff1a;四足机器人正向运动学单腿可视化 实验目的 通过动手实践&#xff0c;搭建mini pupper四足机器人的腿部&#xff0c;掌握机器人单腿结构。通过理论学习&#xff0c;熟悉几何法、旋转矩阵法在运动学正解&#xff08;FK&#xff09;中的用处。通过编程实践&…

一个好的python文件可以有几种用途?

大家好鸭&#xff01;我是小熊猫~ 这次来带大家浅浅回顾一点python小知识~ 源码资料电子书:点击此处跳转文末名片获取 python文件总共有两种用途&#xff1a; 一种是执行文件另一种是被当做模块导入 编写好的一个python文件可以有两种用途&#xff1a; 1. 脚本&#xff0c;…

Laravel框架02:路由与控制器

Laravel框架02&#xff1a;路由与控制器一、路由配置文件二、路由参数三、路由别名四、路由群组五、控制器概述六、控制器路由七、接收用户输入一、路由配置文件 以web网页路由文件为例&#xff1a; 默认根路由 路由定义格式Route::请求方式(请求的URL, 匿名函数或控制响应的方…

【MongoDB】一、MongoDB的安装与部署

【MongoDB】一、MongoDB的安装与部署实验目的实验内容实验步骤一、下载MongoDB安装包二、创建文件夹data及子文件夹db和log三、启动MongDB服务1. 在命令行窗口执行启动MongoDB服务命令2. 打开mongodb.log3. 打开浏览器进行启动验证四、登录MongoDB五、配置环境变量六、将MongDB…

yii-shopwind商城多数页面报错,修改mysql一个配置就解决!

解决办法打开mysql配置文件&#xff0c;在[mysqld]下添加如下一行&#xff1a;sql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES成功解决!还以为是网站的代码问题, 惊讶到我了. 开源网站下载下来就报错 多不可思议. 终于是配置的问题!加油报错信息如下是其中一个界面的&…

银行数字化转型导师坚鹏:招商银行数字化转型战略研究

招商银行数字化转型战略研究课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚如何制定银行数字化转型战略&#xff1f; 不知道其它银行的数字化转型战略是如何演变的&#xff1f; 课程特色&#xff1a; 用实战案例解读招商银行数字化转型战略。 用独特视角解…

【自然语言处理】基于句子嵌入的文本摘要算法实现

基于句子嵌入的文本摘要算法实现人们在理解了文本的含义后&#xff0c;很容易用自己的话对文本进行总结。但在数据过多、缺乏人力和时间的情况下&#xff0c;自动文本摘要则显得至关重要。一般使用自动文本摘要的原因包括&#xff1a; 减少阅读时间根据摘要&#xff0c;选择自…

Widget中的State-学习笔记

Widget 有 StatelessWidget 和 StatefulWidget 两种类型。StatefulWidget 应对有交互、需要动态变化视觉效果的场景&#xff0c;而 StatelessWidget 则用于处理静态的、无状态的视图展示。StatefulWidget 的场景已经完全覆盖了 StatelessWidget&#xff0c;因此我们在构建界面时…

如何把Windows自带壁纸、锁屏壁纸取出作为自己的桌面壁纸?(附:批量更改文件后缀名的方法)

这是一个目录0.0Windows桌面自带壁纸&#xff08;个性化中的壁纸&#xff09;Windows聚焦的锁屏壁纸批量更改后缀名的办法最近开机时&#xff0c;发现Windows聚焦的锁屏壁纸都很好看&#xff0c;特别想留下来当桌面壁纸&#xff0c;寻找了一下之后&#xff0c;终于找到了储存路…

第一节 变量、数据类型、关键字标识符

变量 什么是变量&#xff1a;就是用来存储一个数据的内存区域&#xff0c;而且里面存储的数据可以变化。 double money 10.0&#xff1b; 变量使用的注意事项&#xff1a; 1.先声明再使用。 2.变量声明后&#xff0c;就不能存储其他数据。 3.变量的有效范围是从定义开始到“}…

Dubbo源码解析-——SPI机制

文章目录一、什么是SPI机制二、Java原生的SPI机制2.1、javaSPI示例2.1.1、编写接口和实现类2.1.2、编写配置文件2.1.3、通过SPI机制加载实现类2.1.4、JAVA SPI 源码解析2.1.4.1、ServiceLoader#load2.1.4.2、ServiceLoader构造方法2.1.4.3、ServiceLoader#reload2.1.4.4、LazyI…

IoT项目系统架构案例2

项目背景 1.这个项目是对之前的案例的升级改造参考&#xff1a;IoT项目系统架构案例_iot案例_wxgnolux的博客-CSDN博客2.基于方案1的项目实施过程中碰到的问题,对硬件设备标准化的理念及新的功能需求(如根据天气预报温度调水温,APP界面可操作性优化等)•采用目前IoT主流厂商的架…