全面的聊一聊,什么是严格模式
2021-09-13
2分钟阅读时长
严格模式(Strict Mode)是一种 JavaScript 执行模式,它使得 JavaScript 的行为更加严格和规范化。在严格模式下,一些不安全或者容易出错的语法行为将被禁止,同时也会有一些新的行为和限制。本文力求全面地概括严格模式那些事。
如何开启严格模式
在代码头部添加 “use strict”; 即可开启严格模式。
不同位置添加的区别:
- 在 js 文件头部添加,为整个文件的 js 代码开启严格模式
- 在函数体头部添加,为该函数体的代码开启严格模式
在严格模式下
变量部分
- 变量必须先声明再使用
- 无法使用delete关键字删除变量
- 不允许变量名为 implements、interface、let、package、private、protected、public、static 和 yield
对象部分
- 给只读属性赋值会抛出 TypeError
- 在不可配置属性上使用 delete 会抛出 TypeError
- 给不存在的对象添加属性会抛出 TypeError
函数部分
- 参数命名必须唯一
- 在函数体里对参数赋值不会改变 arguments 里的内容
- 去掉了 arguments.callee 和 arguments.caller
- 不允许函数名为 implements、interface、let、package、private、protected、public、static 和 yield
- 不允许在脚本或函数顶级范围内创建函数,比如:在 if 语句里声明函数
- 当函数参数使用了剩余操作符、解构操作符和默认参数等特性时,函数内部不可再指定严格模式否则会报错。全局指定严格模式是支持的
- eval 函数不会在其对应的上下文中创建变量或者函数
- 不允许使用修改 eval 和 arguments 的值,或者将其作为标识符使用
this 部分
使用函数的 apply()或 call()修改this指向时,在非严格模式下 null 或 undefined 值会被强制转型为全局对象。在严格模式下,则始终以指定值作为函数 this 的值,无论指定的是什么值。
类与模块
类与模块都是ES6之后的新特性,语法上不用兼容旧版本。所以类和模块里定义的代码都是处于严格模式。
其他变化
- 禁止使用with语句
- 取消八进制字面量(0开头的)
- 严格模式下parseInt(“010”)的实际值会是10