摘要:在日常JS/TS项目开发过程中,经常会在文件开头看到"use strcit"字样,这里的“使用严格”是什么意思?

本文分享自华为云社区《JS/TS里的"use strict"严格模式是什么?》,作者: gentle_zhou。

在日常JS/TS项目开发过程中,经常会在文件开头看到" use strcit "字样,这里的“使用严格”是什么意思?

看字面意思来解释,就是这个项目文件是在严格的条件下运行的。那么什么是严格的条件?为什么我们需要严格的条件呢?

严格模式是什么

"use strcit"是在 JavaScript 1.8.5 (ECMAScript5)版本中新增的:

"use strcit"并不是一条语句,而是一个拥有与普通代码不同含义的声明;我们通过在脚本或函数的头部添加"use strcit"表达式来声明严格模式的使用。严格模式的意义让项目中代码可以在严格条件下执行,可以限制一些不良的编码习惯,把问题在编码阶段就可以暴露出来。

支持严格模式的浏览器有:Internet Explorer 10 +、 Firefox 4+ Chrome 13+、 Safari 5.1+、 Opera 12+。

如何在浏览器查看报错信息呢?我们可以按下F12按钮或则点击浏览器页面右上角的三个点-更多工具-开发者工具,开启调试模式:

然后点击控制台tab,查看报错信息:

为什么我们需要严格模式

与严格模式相对的模式是sloppy mode(草率模式),从名字上我们就能看出来,它在我们编写代码过程中的应对态度就是随意的、草率的。Sloppy mode不是一个正式的名称,只要我们没有用严格模式来声明,那么这个js/ts文件就处于sloppy mode中。

那么我们为什么要用严格模式(还需要额外声明),而不是直接使用草率模式呢?

严格模式可以消除JS/TS语法里一些不合理,不严谨的地方,可以让JS/TS往更合理、更安全、更严谨的方向去发展:

  • 通过将一些JS/TS的静默错误更改为抛出错误,消除了JS/TS的一些静默错误,能更加有效保障代码运行的安全;
  • 提高编译器效率,增加运行速度;
  • 禁止一些可能在ECMAScript未来版本中定义的语法。

关于有哪些静默错误,部分会在下面的严格模式限制实例section这一节里展示。

严格模式限制实例

1、不允许使用未声明的变量

在调试模式下会显示“Uncaught ReferenceError: x is not defined”

正确的表达应该是let x = 520;

2、不允许删除变量或对象

在调试模式下会显示“Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.”

3、不允许删除函数

在调试模式下会显示“Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.”

4、不允许变量重名

在调试模式下会显示“Uncaught SyntaxError: Duplicate parameter name not allowed in this context.”

5、不允许使用八进制

在调试模式下会显示“Uncaught SyntaxError: Octal literals are not allowed in strict mode.”

6、不允许使用转义字符

在调试模式下会显示“Uncaught SyntaxError: Invalid or unexpected token.”

7、不允许对只读属性赋值

在调试模式下会显示“Uncaught TypeError: Cannot assign to read only property 'x' of object '#<Object>'.”

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

在调试模式下会显示“Uncaught TypeError: Cannot set property x of #<Object> which has only a getter.”

9、不允许删除一个不允许删除的属性

在调试模式下会显示“Uncaught TypeError: Cannot delete property 'prototype' of function Object() { [native code] }.”

10、变量名不能使用 “eval” 字符串/“arguments” 字符串

在调试模式下会显示“Uncaught SyntaxError: Unexpected eval or arguments in strict mode.”

11、不允许使用以下这种语句

在调试模式下会显示“Uncaught SyntaxError: Strict mode code may not include a with statement.”

12、由于一些安全原因,在作用域 eval() 创建的变量不能被调用

在调试模式下会显示“Uncaught ReferenceError: x is not defined.”

同时,为了向将来Javascript的新版本过渡,严格模式新增了一些保留关键字:

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield

举个栗子,如果我们变量名取为其中一个保留的关键字'public',那么就会报错“Uncaught SyntaxError: Unexpected strict mode reserved word”

参考链接

  1. http://www-lia.deis.unibo.it/materiale/JS/developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/1.8-2.html
  2. https://developer.mozilla.org/en-US/docs/web/javascript/reference/strict_mode
  3. https://developer.mozilla.org/en-US/docs/Glossary/Sloppy_mode
  4. https://www.runoob.com/js/js-strict.html

点击关注,第一时间了解华为云新鲜技术~

为啥JS/TS里都会有"use strict"的更多相关文章

  1. 教你如何解决JS/TS里特定String进行拆分然后遍历各个元素

    摘要:我们需要先判断特定String里是否包含我们需要的元素,针对这个元素对这个字符串进行拆分,遍历各个元素. 本文分享自华为云社区<JavaScript/TypeScript项目里如何对特定S ...

  2. jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行?

    jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行? 因为在解析时最新解析的就是JA ...

  3. JS/TS项目里的Module都是什么?

    摘要:在日常进行JS/TS项目开发的时候,经常会遇到require某个依赖和module.exports来定义某个函数的情况.就很好奇Modules都代表什么和有什么作用呢. 本文分享自华为云社区&l ...

  4. 一些angular/js/ts的坑和吐槽

    ------20190318 ------------- 回头看,很多槽点已经随着升级改掉了   绑定string字面值到子组件@Input <app-overlay-static [name] ...

  5. 前端 JS/TS 调用 ASP.NET Core gRPC-Web

    前言 在上两篇文章中,介绍了ASP.NET Core 中的 gRPC-Web 实现 和 在 Blazor WebAssembly 中使用 gRPC-Web,实现了 Blazor WebAssembly ...

  6. 在js脚本里计算多个小数的加法问题

    当在js脚本里计算多个小数的加法时,算得的结果往往会自动取整,这时候我们就应该加入以下代码: function toDecimal(x) { var val = Number(x); if (!isN ...

  7. 在被vue组件引用的 js 文件里获取组件实例this

    思路: 通过调用函数 把 组件实例this  传递 到 被应用的 js文件里 实例: 文件结构 在SendThis.vue 文件中引用 了modalConfig.js import modalConf ...

  8. 在普通js文件里引入vue实例的方法

    首先是我是写了一个 Loading 插件然后 是挂在打vue.prototype 原型上的. 在main.js中use使用了这个插件. 至此vue原型是就被我挂上 $loadding方法了. 然后我想 ...

  9. 在js文件里调用另一个js文件里的函数

    这个是我今天解决的一个小问题,我在创建界面的时候,根据不同的界面需求对应创建了不同的js文件来搭建界面,搭建完毕之后再将各个生成页面的函数汇总到主界面上,通过visibility属性切换显示,这时候出 ...

  10. 常用代码之五:RequireJS, 一个Define需要且只能有一个返回值/对象,一个JS文件里只能放一个Define.

    RequireJS 介绍说一个JS文件里只能放一个Define,这个众所周知,不提. 关于Define,它需要有一个返回值/对象,且只能有一个返回值/对象,这一点却是好多帖子没有提到的,但又非常重要的 ...

随机推荐

  1. 未能添加SSL证书,错误1312

    1.win+r打开运行,输入mmc 2.在控制台1[控制台根节点]->文件->添加/删除....->选择证书->添加-选择计算机账户->完成->确认 3.找到证书文 ...

  2. MySQL系列:binlog日志详解(参数、操作、GTID、优化、故障演练)

    目录 简介 作用 系统参数 --log_bin --server_id --binlog_format --sync-binlog(双一标准) --gtid-mode(gtid) --enforce- ...

  3. Radius+OpenLdap+USG防火墙认证

    1.1.安装OpenLdap # 在数据目录创建ldap文件存放ldap的配置文件 mkdir -p /data/ldap/{data,conf} docker run -p 389:389 -p 6 ...

  4. C函数指针和回调函数

    函数指针 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: t ...

  5. 神经网络基础篇:Python 中的广播(Broadcasting in Python)

    Python 中的广播 这是一个不同食物(每100g)中不同营养成分的卡路里含量表格,表格为3行4列,列表示不同的食物种类,从左至右依次为苹果,牛肉,鸡蛋,土豆.行表示不同的营养成分,从上到下依次为碳 ...

  6. SQL改写案例2

    postgresql 并没有像 oracle .dm 有这么丰富的 hint,在不改 sql 的情况下能干预执行计划. 如果想学好 postgresql.kingbase.MySQL  的sql 调优 ...

  7. Java Junit单元测试(入门必看篇)

    Hi i,m JinXiang 前言 本篇文章主要介绍单元测试工具Junit使用以及部分理论知识 欢迎点赞  收藏 留言评论 私信必回哟 博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言 ...

  8. PEP9

    利用循环语句 counter 是计数器 需要在后面输入个3才是3个数字之和 Set sum to 0 Set counter to 0 Set limit to number of values to ...

  9. 下载神器——you-get

    下载神器--you-get 01. you-get下载 you-get是一个基于Python3开发的开源项目. 某些网站的音视频资源,本身不提供下载功能,通过you-get,可以通过几条简单的命令去下 ...

  10. SQL模糊查询语法思考

    模糊查询 sql语句: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 % :表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示 ...