全面的聊一聊,什么是严格模式

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