在 ES11 中严格模式和宽松模式到底有何区别!

阅读时长 3 分钟读完

当我们学习 JavaScript 时,可能听过严格模式和宽松模式,但具体它们有什么区别呢?在 ES11 中,这一问题得到了更加明确的回答,本文将为大家详细介绍严格模式和宽松模式的区别,并给出示例代码。

严格模式是什么?

严格模式是 ECMAScript 5 引入的一种特殊的限制代码行为的方式。在严格模式下,程序员必须更加小心地编写代码,因为一些通常被视为合法的语法在严格模式下是不允许使用的。

要启用严格模式,我们需要在代码文件的开头添加一个字符串:"use strict";。也可以在函数内部启用严格模式,但这只影响函数内部。

严格模式会引入一些改变,包括:

  • 禁止使用 with 语句。
  • 变量必须先声明再使用。
  • 禁止删除变量。
  • 对象的属性名不能重名。
  • 函数参数不能同名(这在非严格模式下是被允许的)。
  • 禁止使用 eval 和 arguments。
  • 禁止访问对象未定义的属性。
  • 禁止把函数当做构造函数使用。
  • 禁止在函数内部修改 arguments 对象。
  • this 的指向会变得更加严格。
  • 等等。

宽松模式是什么?

宽松模式是相对于严格模式而言的。在宽松模式下,JavaScript 会容忍更多的代码行为,这意味着可以使用更加灵活的语言特性来编写代码。我们在代码文件的开头不需要加任何额外的声明即可使用宽松模式。

在宽松模式下,对于代码行为的限制会更松,例如:

  • 变量可以不声明直接使用。
  • 删除变量是被允许的。
  • 函数参数可以同名。

严格模式和宽松模式的区别

现在我们已经知道严格模式和宽松已经分别是什么,那么它们有哪些具体的区别呢?下面是严格模式和宽松模式的具体区别:

  • 在严格模式下,函数中的 this 不能指向全局对象。在宽松模式中,如果函数未指定 this,则默认为全局对象。
  • 在严格模式中,arguments 对象是一个普通的数组对象。在宽松模式中,arguments 对象可以是一个伪数组。
  • 在严格模式中,eval 或 arguments 不能成为变量名。在宽松模式中,eval 和 arguments 可以被用作变量名。
  • 在严格模式中,函数必须先声明再使用。在宽松模式中,可以在不声明的情况下使用函数。
  • 在严格模式中,变量必须先声明再使用。在宽松模式中,可以在不声明的情况下使用变量。
  • 在严格模式中,重复命名属性时会抛出错误。在宽松模式中,重复命名属性是被允许的。
  • 在严格模式中,更多的语法错误会被抛出。在宽松模式中,大部分语法错误是被容忍的。

示例代码

下面是一个示例代码,可以更好地理解严格模式和宽松模式的区别:

-- -------------------- ---- -------
---- --------

--- - - ---

-------- ----- -
  ---- --------
  --- - - ---
  ---------------
-

--------------- -- --

------ -- --

在上面的代码中,我们在函数内部使用了一个严格模式。这就意味着,函数参数必须先声明,不能直接赋值。

此外,我们在函数中声明了一个变量 x,这个变量与全局变量 x 的作用域是不同的。

最后,我们分别输出了全局变量 x 和函数内部的变量 x,并分别得到了 10 和 20。

结论

到这里,我们应该已经清楚了严格模式和宽松模式的区别。在实际编写代码时,我们需要根据项目需要来选择使用哪一种模式。如果要求代码行为更加规范,就应该使用严格模式;如果要求代码更灵活,则可以使用宽松模式。

总之,无论是严格模式还是宽松模式,我们都需要注意自己的代码行为,避免出现难以调试的错误。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670ca1715f551281025b3d22

纠错
反馈