本文最后更新于:2024年4月25日 上午
开启严格模式
全局开启
在脚本首行
标记'use strict'
开启全局严格模式
1 2 3 4
| <script> 'use strict' </script>
|
全局使用严格模式导入没有启用严格模式的库时可能会不兼容
函数单独开启
在函数首行标记'use strict'
函数语块开启严格模式
1 2 3 4
| function fn() { 'use strict' }
|
默认的开启
在es6
语法中强制使用严格模式
严格模式的优势
- 可以对静默错误报错
- 优化了代码执行效率
- 对未来的保留关键字语法约束
严格模式的特性
严格模式会对以下行为会执行报错
禁止隐式全局变量声明
原先赋值未定义的变量时默认声明全局变量的行为被禁止
1 2 3 4 5 6
| 'use strict' let myName myName = 'Jonathan' myNeme = 'Jonathan'
|
禁止删除变量名
1 2 3 4
| 'use strict' const myName = 'Jonathan' delete myName
|
禁止同名形参
1 2 3 4 5 6 7
| 'use strict' console.log(sum(1, 2, 3))
function sum (a, a, b) { return a + a + b }
|
禁止使用前导0表示八进制
应使用es6
语法表示八进制(使用前缀0o
或0O
)
1 2 3 4
| 'use strict' const num = 010 console.log(num)
|
禁止对对象执行违规操作
禁止对只读属性赋值
1 2 3 4 5 6 7 8
| 'use strict' const nums = {} Object.defineProperty(nums, 'a', { value: 1, writable: false }) nums.a = 2
|
禁止删除不可删除属性
1 2 3 4 5 6 7 8
| 'use strict' const nums = {} Object.defineProperty(nums, 'a', { value: 1, configurable: false }) delete nums.a
|
禁止拓展不可拓展对象
1 2 3 4 5 6 7
| 'use strict' const nums = { x: 1 } Object.preventExtensions(nums) nums.y = 2
|
禁止在块级作用域声明全局函数
在非严格模式下会输出两个1
1 2 3 4 5 6 7 8 9 10
| 'use strict' if(true) { function fn () { console.log(1) } fn() } fn()
|