JavaScript 不断向前发展并且没有带来任何兼容性的问题。新的特征被加入,旧的功能也没有改变,这么做有利于兼容旧代码;但是 JavaScript 创造者的任何错误或者不完善的决定也将永远被保留在 JS 这门语言中。
在 ES5 标准中,JS 提出了严格模式(Strict Mode)的概念。严格模式是一种具有限制性的 JS 模式,从而使代码隐式地脱离了懒散模式(Sloppy Mode)。
支持严格模式的浏览器在检测到代码中开启了严格模式后,会以严格的方式对代码进行检测和执行。
开启严格模式:
通过在文件或者函数的开头使用 "use strict" 来开启严格模式。可以对整个文件开启严格模式,也可以单独对某个函数开启严格模式。
ES6 中的 class 和 module 默认开启了严格模式。
打包后的代码一般都默认开启了严格模式。
严格模式对代码的限制:
- 严格模式下不允许
0开头的八进制语法。0o开头可以,0开头不可以。 - 严格模式下不允许使用 with 操作符。
- 严格模式下
eval()函数里创建的变量,外层引用不到。"use strict" eval(`var message = 'Hello'`) console.log(message) // 非严格模式下 eval 函数里创建的变量,外部也可以引用到;严格模式下报错:Uncaught ReferenceError: message is not defined - 严格模式下不会创建意外的全局变量。
"use strict" function fn() { message = 'Hello' // 非严格模式下,不使用 var 声明的变量会被创建为全局变量;严格模式下,不使用 var 声明的变量不会被创建为全局变量 } fn() console.log(message) // 非严格模式下能成功访问;严格模式下访问报错:Uncaught ReferenceError: message is not defined - 严格模式下 this 绑定不会默认转成对象。
全局的 this 不会被转成 window,而是 undefined;函数内部的 this 也不会被默认转成对象。
function fn1() { console.log(this) } fn1.apply('abc') function fn2() { "use strict" console.log(this) } fn2.apply('abc')
- 严格模式下会将静默错误明确抛出。
"use strict" var obj = { message: 'Hello World' } Object.defineProperty(obj, 'message', { writable: false // 配置为不可修改 }) obj.message = 'Hello JS' // 非严格模式下修改不会抛出任何错误;严格模式下修改报错:Uncaught TypeError: Cannot assign to read only property 'message' of object '#<Object>'
严格模式是JavaScript的一种限制性模式,旨在提高代码质量,防止意外的全局变量创建和错误的静默处理。在严格模式下,未声明的变量不会自动成为全局变量,尝试修改只读属性或使用相同参数名的函数会抛出错误,而且不允许使用`with`语句和特定的八进制语法。此外,`this`的绑定行为也有所不同,不会默认转换为对象。
1857






