2023-03-09 19:54:33
JS/TS里都会有"use strict"的原因是为了启用严格模式。
严格模式是什么:"use strict"是在JavaScript 1.8.5 (ECMAScript5)版本中新增的一个特性。它并不是一个语句,而是一个拥有与普通代码不同含义的声明。通过在脚本或函数的头部添加"use strict"表达式,可以声明该脚本或函数在严格模式下执行。严格模式的意义在于让项目中的代码可以在更严格的条件下执行,从而限制一些不良的编码习惯,把潜在的问题在编码阶段就暴露出来。
为什么我们需要严格模式:
消除静默错误:严格模式可以将一些JavaScript/TypeScript中的静默错误更改为抛出错误,从而更加有效地保障代码运行的安全。这些静默错误在普通模式下可能不会引发问题,但在严格模式下会被明确地指出,有助于开发者及时发现并修复问题。
提高编译器效率和运行速度:通过启用严格模式,编译器可以对代码进行更严格的检查,从而在某些情况下提高编译效率。同时,由于严格模式限制了一些不规范的编码行为,也有助于提升代码的运行速度。
禁止未来可能定义的语法:严格模式还禁止了一些可能在ECMAScript未来版本中定义的语法,这有助于保持代码的兼容性和前瞻性。
严格模式的限制实例:
不允许使用未声明的变量:在严格模式下,如果尝试使用未声明的变量,将会抛出ReferenceError错误。
不允许删除变量或对象:在严格模式下,尝试删除变量或对象将会抛出SyntaxError错误。
不允许删除函数:同样地,尝试删除函数也会抛出SyntaxError错误。
不允许变量重名:在严格模式下,不允许在函数参数或变量声明中出现重名的情况,否则会抛出SyntaxError错误。
不允许使用八进制:在严格模式下,八进制字面量是不被允许的,尝试使用将会抛出SyntaxError错误。
不允许使用某些转义字符:严格模式对转义字符的使用也进行了限制,某些在普通模式下被允许的转义字符在严格模式下将会引发错误。
不允许对只读属性赋值:尝试对只读属性进行赋值将会抛出TypeError错误。
不允许对一个使用getter方法读取的属性进行赋值:同样地,如果属性是通过getter方法读取的,那么尝试对其进行赋值也会抛出TypeError错误。
不允许删除一个不允许删除的属性:尝试删除某些内置对象的属性(如Object.prototype)将会抛出TypeError错误。
变量名不能使用保留关键字:在严格模式下,变量名不能使用JavaScript/TypeScript的保留关键字,否则会抛出SyntaxError错误。
不允许使用with语句:with语句在严格模式下是不被允许的,因为它会改变作用域链的查找方式,从而可能导致不可预测的行为。
作用域eval()创建的变量不能被调用:出于安全原因,在严格模式下,通过eval()函数创建的变量在外部作用域中是不可见的。
综上所述,"use strict"在JavaScript/TypeScript中扮演着非常重要的角色,它通过启用严格模式来限制一些不良的编码习惯,提高代码的安全性和可维护性。同时,严格模式还有助于提升编译器的效率和代码的运行速度,为未来的JavaScript/TypeScript版本做好准备。