点击上方“前端自习课”关注,学习起来~

注:本文为 《 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)的更多相关文章

  1. JavaScript严谨模式(Strict Mode)

    下面的内容翻译自It’s time to start using JavaScript strict mode,作者Nicholas C.Zakas参与了YUI框架的开发,并撰写了多本前端技术书籍,在 ...

  2. Javascript 严格模式(strict mode)详解

    Javascript 严格模式详解   一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Ja ...

  3. Javascript 严格模式 strict mode(转)

    一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. ...

  4. JavaScript 严格模式(strict mode)

    概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:'严格模式'.顾名思义,这种模式使得Javascript在更严格的条件下运行. 目的 1: 消除Javascript语法的一些不合 ...

  5. JavaScript严谨模式(Strict Mode)提升开发效率和质量

    http://flandycheng.blog.51cto.com/855176/982719 http://my.oschina.net/Jsiwa/blog/272761

  6. Javascript 严格模式("use strict";)详细解解

    1 1 1 Javascript 严格模式("use strict";)详细解解 "use strict";定义JavaScript代码应该在"str ...

  7. JS基础 复习: Javascript的书写位置

    爱创课堂JS基础 复习: Javascript的书写位置复习 js书写位置:body标签的最底部.实际工作中使用书写在head标签内一对script标签里.alert()弹出框.console.log ...

  8. (" use strict")Javascript 严格模式详解

    Javascript 严格模式详解 转载别人的博客内容,浏览了一遍,没有全部吸收,先保存一下链接 http://www.ruanyifeng.com/blog/2013/01/javascript_s ...

  9. javascript运行模式:并发模型 与Event Loop

    看了阮一峰老师的JavaScript 运行机制详解:再谈Event Loop和[朴灵评注]的文章,查阅网上相关资料,把自己对javascript运行模式和EVENT loop的理解整理下,不一定对,日 ...

随机推荐

  1. Test Complete 的自动化测试 --- 三角形

    Test Complete 的自动化测试 --- 三角形 PS:工具:Test Complete , OS:win 10 这里做三角形的测试与上一篇博客做计算器的测试大致一样,都是对.exe的执行文件 ...

  2. Cesium小插件改造--clock和timeline

    一.Clock 废话不多说,先上效果图再说.如效果图所示:clock的日期显示为YY/MM/DD这种简洁明了格式,时间则为当前系统时间(也就是北京时间).Clock内部以儒略日(JulianDate) ...

  3. django_1:配置文件

    工程下: settings.py(建议设置成如下) DATABASES                                   #数据库配置 DEBUG = True           ...

  4. 开始逆向objc基础准备(二)我的平台是simulator-x86_64

    建项目运行中断调试,lldb中显示寄存器看到有rax-r15, stm0-stm7, xmm0-xmm15, ymm0-ymm15,即为x64体系支持sse4. 再在lldb中查看寄存器别名得到以下对 ...

  5. 【Oracle】Oracle数据库基本指标查看

    目录 1.查看表空间 2.查看用户 3.查看数据库内存 4.查看数据库版本 5.oracle归档情况 6.查看redo log日志位置 7.查看数据库的控制文件 8.查看RMAN的备份情况 9.FRA ...

  6. add jar and proxy repo

    1. 添加代理仓库 2. 添加host 仓库 3. 添加私有jar 4. 添加仓库到public 仓库

  7. 什么鬼,面试官竟然让我用Redis实现一个消息队列!!?

    GitHub 9.4k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 9.4k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 9.4k Star 的 ...

  8. JVM的类加载机制全面解析

    什么是类加载机制 JVM把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这就是JVM的类加载机制. 如果你对Class文件的结 ...

  9. 《手把手教你》系列练习篇之5-python+ selenium自动化测试(详细教程)

    1.  简介 今天我们继续前边的练习,学习和练习一下:如何使用webdriver方法获取操作复选框-CheckBox.测试不同的分辨率.如何断言title.如何获取某一个元素的text属性值等等,这些 ...

  10. 最全最新🇨🇳中国【省、市、区县、乡镇街道】json,csv,sql数据

    中华人民共和国行政区划代码 中华人民共和国行政区划(五级):省级.地级.县级.乡级和村级. 来自中华人民共和国民政部,用于查询中国省,市和区数据的网站. 中华人民共和国行政区划代码,更新时间:2019 ...