JS严格模式(use strict)

news2025/1/16 16:52:29

javascript语法不够严谨,例如我们在项目中不用关键字去定义了一个变量a,控制台一切正常。

 b=123;
 console.log(b)

但是,如果开启了严格模式呢?

"use strict"
b=123;
console.log(b)

此时将会报错Uncaught ReferenceError: b is not defined

补充:开启严格模式就是加上"use strict",指令只有在整个脚本第一行或者函数第一行时才能被识别,除了 IE9 以及更低的版本外,所有的浏览器都支持该指令。

严格模式下对语法要求比较高,添加严格模式,主要有以下几个目的:

  • 消除 JavaScript 语法中一些不合理、不严谨的地方;

  • 消除代码中一些不安全的地方,保证代码的安全运行;

  • 提高 JavaScript 程序的运行效率;

  • 为以后新版本的 JavaScript 做好铺垫。

目的呢,了解即可,毕竟一般情况用的真的不多。

严格模式中的一些变化

  1. 不允许使用未申明的变量;

for(i = 0; i < 2; i++) { // 此处报错:Uncaught ReferenceError: i is not defined
}
b=123;//报错;
  1. 不允许删除变量和函数

在严格模式下,删除变量或函数,则会报错:Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.

"use strict"
var b={name:'hahah',age:'90'};
delete b
function sum(a, b) {
    return a + b;
}
delete sum;
  1. 函数中不允许有同名的参数。

"use strict"
        
    function fn(a,a){ //报错,Uncaught SyntaxError: Duplicate parameter name not allowed in this context
        return a+a;
    }
     console.log(fn(6,5))

这里补充一点:若是普通状态下的计算结果会是什么呢?

function fn(a,a){
        return a+a;
    }
console.log(fn(6,5))//10

通过验证的几个,可以知道全部按照最后一位参数进行计算的!!

当然,实际项目中,不可能哪个人参数弄一样的,给你一个大比兜。

  1. eval 语句的作用域是独立的。

不知道你是不是和我一样,见到eval方法瞬间懵了,还有这玩意????

语法:eval(string);其中string为字符串啊!!!!

eval() 函数计算或执行参数。如果参数是表达式,则 eval() 计算表达式。如果参数是一个或多个 JavaScript 语句,则 eval() 执行这些语句。

我们普通模式下,是这样的:

eval("var x = '18';")
console.log(x) //18

🆗,可以看出完全没问题,但是加了严格模式呢?是这样的:

"use strict"
eval("var x = '18';")
console.log(x)//Uncaught ReferenceError: x is not defined

可以看出,在严格模式下,eval 语句本身就是一个局部作用域,通过 eval 语句生成的变量只能在 eval 语句内使用。

  1. 不允许使用 with 语句。

with语句???对不起,我又懵了!各位想必一样吧,毕竟这玩意真的不多用,很冷门的东西。可能会在无意中污染作用域,而且在复杂情形中,关于作用域的出错会变得很麻烦。在严格模式中,禁止使用with方法。

  1. 不允许对只读属性赋值。

"use strict"
    var obj = {}
    Object.defineProperty(obj,'name',{value:'java',writable:false})
    obj.name='go' // Uncaught TypeError: Cannot assign to read only property 'name' of object '#<Object>'

7.不允许使用八进制数

"use strict"
var x = 010;
console.log(x)//Uncaught SyntaxError: Octal literals are not allowed in strict mode.

8.在if语句外调用在 if 语句中定义的函数时,会提示函数未定义。

"use strict"
    if (true) {
        function demo() { // 此处报错:Uncaught ReferenceError: demo is not defined
            console.log("11111");
        }
    }
    demo()

9.不允许删除一个不允许删除的属性:

"use strict"
    delete Object.prototype;//Uncaught TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
    console.log(Object)//Uncaught SyntaxError: Octal literals are not allowed in strict mode.

10.不允许对一个使用getter方法读取的属性进行赋值

"use strict";
var obj = {get x() {return 0} };

obj.x = 3.14;  // 报错Uncaught TypeError: Cannot set property x of #<Object> which has only a getter

11.不允许使用转义字符。

"use strict";
var x = \010;            // 报错

12.禁止this关键字指向全局对象。

function f(){
    return !this;
} 
// 返回false,因为"this"指向全局对象,"!this"就是false

function f(){ 
    "use strict";
    return !this;
} 
// 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。

因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。

function f(){
    "use strict";
    this.a = 1;
};
f();// 报错,this未定义

总的来说,了解即可,又没说让你一次写完,永不出错。配合着报错,外加了解其中的缘由,相信当哪天使用严格模式的时候也会快速发现问题。

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

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

相关文章

开关电源中功率电感均方根电流是如何推导的?来自《开关电源宝典》

3.2.8 功率电感的有效电流参考“1.7.3 功率电感”章节内容&#xff0c;我们知道&#xff0c;功率电感具有温升电流、RMS电流、饱和电流、额定电流等电流参数。在后续“第5章 降压电路的应用方法”应用实例中进行功率电感选型时&#xff0c;需要保证所选电感的额定电流参数大于实…

自定义类型:结构体,枚举,联合(1)

tips 1. 2. 结构基础知识复习 1. 结构是一些值的集合&#xff0c;这些值被称为成员变量&#xff0c;结构的每个成员可以是不同类型的变量。 2. 结构体类型&#xff0c;结构体成员&#xff0c;结构体变量&#xff0c;结构体指针的创建方式 3. 初始化结构体变量的时候&…

华为开源自研AI框架昇思MindSpore应用实践:FGSM网络对抗攻击

目录一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例二、对抗样本定义三、攻击方法快速梯度符号攻击&#xff08;FGSM&#xff09;四、数据处理五、训练LeNet网络六、实现FGSM七、运行攻击近年来随着数据、计算能力、理论的不断发展演进&#xff0c;深度学习在图…

老板要求总部-分部异地组网,作为IT运维怎样才能避免踩坑?

最近在开年会&#xff0c;老板提出2023年要全面搭建30个分公司的广域网架构&#xff0c;总部和分公司网络实现统一管理。但是公司原有网络架构复杂&#xff0c;各分支又是不同运营商接入的现状&#xff0c;想要实现异地组网并不容易&#xff01;然而&#xff0c;老板还不断提出…

好用的基于vue的组织架构图组件

都是基于vue的组织架构图&#xff0c;有支持vue2.x和vue3.x,可自行选择使用 一、vue-okr-tree&#xff08;支持vue2&#xff09; 文档地址&#xff1a;vue2-okr-tree 这个文档里面只有使用方法&#xff0c;不像vue3-tree-org里面有详细的介绍和安装引入教程 1.安装与引入 n…

第一章 spring框架概述

1.Spring框架概述*Spring是轻量级的开源的JavaEE框架*可以解决企业应用开发的复杂性*有两个核心的部分&#xff1a;IOC、AOPIOC&#xff1a;控制反转&#xff0c;把创建对象的过程交给Spring进行管理AOP&#xff1a;面向切面&#xff0c;不修改源代码的情况下进行功能的增加*Sp…

ThreadLocal与nheritableThreadLocal的区别及使用

ThreadLocal 多线程环境中&#xff0c;共享变量的并发修改常常导致线程同步问题&#xff0c;ThreadLocal可以存储线程私有的本地变量&#xff0c;从而使线程之间的变量相互隔离 因为ThreadLocal在线程执行的上下文可以传递变量的特性&#xff0c;所以可以很好的解决变量值传递…

PostgreSQL11 | pgsql建表、改表与删表

上一篇文章 PostgreSQL11 | pgadmin4基本使用http://t.csdn.cn/PKpde已经讲解了最简单的pgadmin的数据库创建、外键等可视化的操作&#xff0c;以及对应的pgsql语句 这一篇文章将讲解基础的pgsql语句 建表、改表与删表 目录 建表、改表与删表 创建数据表 单字段主键 多…

12.0、VMware-Linux部署springboot项目(图文超详细教程)

12.0、VMware-Linux部署springboot项目&#xff08;图文超详细教程&#xff09; 第一步&#xff1a;启动 Linux 进入 root 用户&#xff0c;打开终端 输入以下命令 -> 查看 Linux 中是否已经装有 jdk &#xff1b; java -version 1.如果有&#xff0c;需要先将原来的 jdk …

ESP-IDF:使用multimap和vector容器给新员工随机分配部门并按照部门打印

例程&#xff1a; /* 创建5个员工&#xff0c;给5个员工随机分配部门&#xff0c;然后按照部门打印员工*/ #include #include #include #include <time.h> #define SALEDEPARTMENT 1 #define RDDEPARTMENT 2 #define MEDEPARTMENT 3 class worker { public: string …

10分钟做好 Bootstrap Blazor 的表格组件导出 Excel/Word/Html/Pdf

上篇: Bootstrap Blazor 实战 通用导入导出服务(Table组件) 1.新建工程 新建工程b14table dotnet new blazorserver -o b14table将项目添加到解决方案中&#xff1a; dotnet sln add b14table/b14table.csproj使用 nuget.org 进行 BootstrapBlazor 组件安装, FreeSql sqlite…

在线阅读网站|基于Springboot+Vue开发实现小说阅读网站

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

探索SpringMVC-HandlerAdapter之RequestMappingHandlerAdapter

前言 在RequestMappingHandlerAdapter的第一篇文章《探索SpringMVC-HandlerAdapter之RequestMappingHandlerAdapter-参数解析》我们从方法调用的角度提出了三个问题。前面两篇分别回答了方法入参、返回值处理这两个问题。而第三个问题则是由异常处理器负责的&#xff0c;不属于…

栈的讲解及实现(图解+代码/C语言)

今天为大家分享的是栈的模拟实现&#xff0c;本文主要讲解如何以数组的形式模拟实现&#xff0c;同时给出链表模拟实现栈的代码。 目录 图解栈的结构数组模拟栈的分步实现 创建并初始化入栈检测栈是否为空出栈获取栈顶元素获取栈内有效元素个数销毁栈 链表模拟实现栈 模拟思…

学习笔记:统计建模方法的比较分析

前言本文介绍了隐马尔可夫模型 (HMM)、最大熵马尔可夫模型 (MEMM) 和条件随机场 (CRF) 的比较分析。 HMM、MEMM 和 CRF 是三种流行的统计建模方法&#xff0c;通常应用于模式识别和机器学习问题。 让我们更详细地探讨每种方法。一、隐马尔可夫模型 (HMM)“隐藏”一词象征着只有…

node ~ zip压缩 文件加密

我们知道zip压缩,文件加密都是基于http的,下面我用用node实现着几个功能 zip压缩/解压 let zlib require(zlib); // 核心 let path require(path); let fs require(fs);// 压缩流 将1.txt压缩成1.txt.gz function gzip(source){ //source文件目录let gzip zlib.createGzi…

[Android]View的事件分发机制(源码解析)

目录 1.分发对象-MotionEvent 2.如何传递事件 1.传递流程 2.事件分发的源码解析 3.主要方法&#xff1a; 4.事件传递中listener 5.滑动冲突如何用事件分发处理 1.分发对象-MotionEvent 事件类型有&#xff1a; 1.ACTION_DOWN-----手指刚接触屏幕 2.ACTION_MOVE------手…

ASIC和FPGA,选择哪种设计比较好?

很多人都觉得同样都是写Verilog的&#xff0c;ASIC和FPGA其实并没有什么区别&#xff0c;其实并不是这样。那么ASIC和FPGA&#xff0c;选择哪种设计比较好&#xff1f;接下来IC修真院就来为大家细细分析。 ASIC (Application Specific Integrated Circuit)&#xff0c;即专用集…

盘点:2022年勒索金额超百万美元的攻击事件

1、哥斯达黎加政府 勒索赎金&#xff1a;2000万美元 这是2022年最受关注的攻击事件&#xff0c;因为这是一个国家首次宣布进入“国家紧急状态”以应对勒索软件攻击。调查显示&#xff0c;从4月中旬到5月初&#xff0c;27个政府机构成为第一波攻击活动的目标。国家财政部数TB数…

生物化学 SY001盘尼西林

盘尼西林的发现与作用原理 发现历史略 青霉素 青霉素Penicillinβ&#xff0d;内酰胺类抗生素&#xff08;β&#xff0d;lactams&#xff09;青霉素类抗生素水溶性好&#xff0c;血消除半衰期大多不超过2小时音译盘尼西林抑制胞壁粘肽合成酶&#xff0c;从而使细菌胞壁缺损…