【JS】312- 复习 JavaScript 严格模式(Strict Mode)
点击上方“前端自习课”关注,学习起来~
注:本文为 《 JavaScript 完全手册(2018版) 》第30节,你可以查看该手册的完整目录。
严格模式是一项 ES5 功能,它使 JavaScript 以更好的方式运行,因为启用严格模式会更改 JavaScript 语言的语义。
了解严格模式与普通模式(通常称为草率模式)下 JavaScript 代码之间的主要区别非常重要。
严格模式主要是删除 ES3 中可能的功能,并且从ES5开始就被弃用(但是由于向后兼容性要求而没有被删除)。
如何开启严格模式
严格模式是可选的。与 JavaScript 中的每一个重大变化一样,我们不能简单地改变语言行默认的为方式,因为这会破坏大量的 JavaScript ,并且 JavaScript 会花费大量精力来确保1996年的JavaScript代码仍然有效。这是其成功的关键。
因此,我们需要使用 'use strict' 指令来启用严格模式。
你可以将它放在文件的开头,将其应用于文件中包含的所有代码:
JavaScript 代码:
'use strict'
const name = 'Flavio'
const hello = () => 'hey'
//...
你还可以通过在函数体的开头的位置添加 'use strict' ,来为该函数单独启用严格模式:
JavaScript 代码:
function hello() {
'use strict'
return 'hey'
}
在遗留代码上操作时,这很有用,在遗留代码中你没有时间进行测试,也可能没有信心在整个文件上启用严格模式。
严格模式改变了什么
意外的全局变量
如果为未声明的变量赋值,则默认情况下 JavaScript 会在全局对象上创建该变量:
JavaScript 代码:
;(function() {
variable = 'hey'
})()
(() => {
name = 'Flavio'
})()
variable //'hey'
name //'Flavio'
转到严格模式,如果你尝试执行上面的操作,则会出现错误:
JavaScript 代码:
;(function() {
'use strict'
variable = 'hey'
})()
(() => {
'use strict'
myname = 'Flavio'
})()
分配错误
JavaScript 中会隐式转换一些值。
在严格模式下,这些隐式转换会抛出错误:
JavaScript 代码:
undefined = 1
(() => {
'use strict'
undefined = 1
})()
这同样适用于 Infinity,NaN,eval ,arguments 等。
在 JavaScript 中,可以使用下面代码定义对象属性不可写
JavaScript 代码:
const car = {}
Object.defineProperty(car, 'color', { value: 'blue', writable: false })
在严格模式下,你不能覆盖这个值,但在非严格模式下可以这么做:
和 getters 的原理一样:
JavaScript 代码:
const car = {
get color() {
return 'blue'
}
}
car.color = 'red'(
//ok
() => {
'use strict'
car.color = 'yellow' //TypeError: Cannot set property color of # which has only a getter
}
)()
非严格模式允许扩展一个不可扩展的对象:
JavaScript 代码:
const car = { color: 'blue' }
Object.preventExtensions(car)
car.model = 'Fiesta'(
//ok
() => {
'use strict'
car.owner = 'Flavio' //TypeError: Cannot add property owner, object is not extensible
}
)()
另外,非严格模式允许设置原始值的属性,而不会失败,但也没有做任何事情:
JavaScript 代码:
true.false = ''(
//''
1
).name =
'xxx' //'xxx'
var test = 'test' //undefined
test.testing = true //true
test.testing //undefined
在严格模式下,上面所有这些情况都会失败:
JavaScript 代码:
;(() => {
'use strict'
true.false = ''(
//TypeError: Cannot create property 'false' on boolean 'true'
1
).name =
'xxx' //TypeError: Cannot create property 'name' on number '1'
'test'.testing = true //TypeError: Cannot create property 'testing' on string 'test'
})()
删除错误
在非严格模式,如果你尝试删除无法删除的属性,JavaScript 只返回 false ,而在严格模式下,它会引发 TypeError:
JavaScript 代码:
delete Object.prototype(
//false
() => {
'use strict'
delete Object.prototype //TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
}
)()
具有相同名称的函数参数
在普通函数中,你可以使用重复的参数名称:
JavaScript 代码:
(function(a, a, b) {
console.log(a, b)
})(1, 2, 3)
//2 3
(function(a, a, b) {
'use strict'
console.log(a, b)
})(1, 2, 3)
//Uncaught SyntaxError: Duplicate parameter name not allowed in this context
请注意,在这种情况下,箭头函数始终引发 SyntaxError:
JavaScript 代码:
((a, a, b) => {
console.log(a, b)
})(1, 2, 3)
//Uncaught SyntaxError: Duplicate parameter name not allowed in this context
八进制
JavaScript 代码:
console.log(010)
})()
//8
(() => {
'use strict'
console.log(010)
})()
//Uncaught SyntaxError: Octal literals are not allowed in strict mode.
你仍然可以使用 0oXX 语法在严格模式下启用八进制数字:
JavaScript 代码:
;(() => {
'use strict'
console.log(0o10)
})()
//8
移除了 with
严格模式不能使用 with 关键字,以移除一些边缘情况,并允许在编译器层面进行更多优化。
▼原创系列推荐▼1.JavaScript 重温系列(22篇全)
2.ECMAScript 重温系列(10篇全)
3.JavaScript设计模式 重温系列(9篇全)
4.正则 / 框架 / 算法等 重温系列(16篇全)5.【汇总】59篇原创系列汇总
你点的每个赞,我都认真当成了喜欢
【JS】312- 复习 JavaScript 严格模式(Strict Mode)的更多相关文章
- JavaScript严谨模式(Strict Mode)
下面的内容翻译自It’s time to start using JavaScript strict mode,作者Nicholas C.Zakas参与了YUI框架的开发,并撰写了多本前端技术书籍,在 ...
- Javascript 严格模式(strict mode)详解
Javascript 严格模式详解 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Ja ...
- Javascript 严格模式 strict mode(转)
一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. ...
- JavaScript 严格模式(strict mode)
概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:'严格模式'.顾名思义,这种模式使得Javascript在更严格的条件下运行. 目的 1: 消除Javascript语法的一些不合 ...
- JavaScript严谨模式(Strict Mode)提升开发效率和质量
http://flandycheng.blog.51cto.com/855176/982719 http://my.oschina.net/Jsiwa/blog/272761
- Javascript 严格模式("use strict";)详细解解
1 1 1 Javascript 严格模式("use strict";)详细解解 "use strict";定义JavaScript代码应该在"str ...
- JS基础 复习: Javascript的书写位置
爱创课堂JS基础 复习: Javascript的书写位置复习 js书写位置:body标签的最底部.实际工作中使用书写在head标签内一对script标签里.alert()弹出框.console.log ...
- (" use strict")Javascript 严格模式详解
Javascript 严格模式详解 转载别人的博客内容,浏览了一遍,没有全部吸收,先保存一下链接 http://www.ruanyifeng.com/blog/2013/01/javascript_s ...
- javascript运行模式:并发模型 与Event Loop
看了阮一峰老师的JavaScript 运行机制详解:再谈Event Loop和[朴灵评注]的文章,查阅网上相关资料,把自己对javascript运行模式和EVENT loop的理解整理下,不一定对,日 ...
随机推荐
- oracle 数据库,能不能将查询的结果创建成新表。
这个是可以的.sql:create table tablename1 as select t2. * from tablename2 t2 where t2.filename =‘张三’. 解释:就是 ...
- Flex利用JavaScript执行cmd命令
Flex: //注册js事件 protected function init():void { ExternalInterfa ...
- 在WebView中加载HTML页面时显示进度对话框的方法
webView.setWebViewClient(new WebViewClient(){ ProgressDialog prDialog; @Overri ...
- 20191010-7 alpha week 1/2 Scrum立会报告+燃尽图 05
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8750 一.小组情况 队名:扛把子 组长:迟俊文 组员:宋晓丽 梁梦瑶 韩 ...
- 并发编程--greenlet与gevent
什么是greenlet? 虽然CPython(标准Python)能够通过生成器来实现协程,但使用起来还并不是很方便. 与此同时,Python的一个衍生版 Stackless Python实现了原生的协 ...
- Git学习笔记01--常用Git命令、cmd命令及Git总结性知识
资源:外国网友制作的 Git Cheat Sheet 第二次学习廖雪峰老师的Git教程,学习过程中把教程中涉及到的Git命令及总结性知识记录下来方便二次复习. 知识点 所有的版本控制系统,其实只能跟踪 ...
- 《程序人生》系列-害敖丙差点被开除的P0事故
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub https://github.com/JavaFamily上已经收录有一线大厂面试点脑图.个人联系方式和技术交流群,欢迎Star和指教 ...
- 【JavaEE】之MyBatis逆向工程的使用
MyBatis逆向工程可以方便的从数据库中将表自动映射到JAVA POJO类,并同时生成Mapper.xml和Mapper接口,方便实用.下面介绍一下逆向工程的使用方法. 使用逆向工程,我们最好是新建 ...
- Hyperledger Fabric 动态增加组织到网络中
本文基于Hyperledger Fabric 1.4版本. 官方文档地址:传送门 动态添加一个组织到Fabric网络中也是一个比较重要的功能.官方文档写的已经很详细了,有能力的尽量还是看官方文档,本文 ...
- 产品vs程序员:你知道www是怎么来的吗?
精彩回顾: 我是一个explorer的线程 我是一个杀毒软件线程 我是一个IE浏览器线程 比特宇宙-TCP/IP的诞生 Unix.Linux.Windows三大帝国集团发表<关于比特宇宙推进经贸 ...