haizlin/fe-interview

[js] 第18天 你理解的"use strict";是什么?使用它有什么优缺点?

haizhilin2013 opened this issue · 15 comments

第18天 你理解的"use strict";是什么?使用它有什么优缺点?

严格模式,其实就是更严格了

设立"严格模式"的目的,主要有以下几个:
- 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的Javascript做好铺垫。

我放几个常见的吧,详情可以去下面的文章中看

  1. 禁止this关键字指向全局对象
  2. 禁止在函数内部遍历调用栈
  3. 全局变量必须显式声明
  4. arguments不再追踪参数的变化
(function(){
	"use strict"
	b=1//Uncaught ReferenceError: b is not defined
})()

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode
http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html

  • use strict
    严格模式,避免一些不必要的错误
    严格模式下的 全局中的this 是undefined 不是window

严格模式。
此时全局中的this是undefined,而不是window。
严格模式其实还是为了缓解js语言的全局变量特性的缺陷而提出来的一种暂时的解决办法

由于历史原因 JavaScript 在错误提示方面做的并不完善。比如允许定义未声明的变量、不允许使用八进制数字、不允许函数参数重名、不允许删除不可删除的属性。

使用严格模式的好处在于

  • 消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为;
  • 消除代码运行的一些不安全之处,保证代码运行的安全;
  • 提高编译器效率,增加运行速度;
  • 为未来新版本的 Javascript 做好铺垫。

总的来说,使用严格模式会让我们的代码更加健壮。不过随着 TypeScript 的出现,我们更应该使用 TS 来规范我们的代码。

参考文章: JavaScript 严格模式(use strict)

use strict:严格模式

说明:

  1. 使调试更加容易。那些被忽略或默默失败了的代码错误,会产生错误或抛出异常,因此尽早提醒你代码中的问题,你才能更快地指引到它们的源代码。
  2. 变量在赋值之前必须声明,防止意外的全局变量。如果没有严格模式,将值分配给一个未声明的变量会自动创建该名称的全局变量。这是 JavaScript 中最常见的错误之一。在严格模式下,这样做的话会抛出错误。
  3. 取消this值的强制转换。如果没有严格模式,引用 null 或未定义的值到 this 值会自动强制到全局变量。在严格模式下,引用 null 或未定义的 this 值会抛出错误。严格模式下,全局中的this 是undefined 不是window
  4. 不允许重复的属性名称或参数值
  5. 使 eval() 更安全。在严格模式和非严格模式下, eval() 的行为方式有所不同。最显而易见的是,在严格模式下,变量和声明在 eval() 语句内部的函数不会在包含范围内创建(它们会在非严格模式下的包含范围中被创建,这也是一个常见的问题源)。
  6. 在 delete 使用无效时抛出错误。 delete 操作符(用于从对象中删除属性)不能用在对象不可配置的属性上。当试图删除一个不可配置的属性时,非严格代码将默默地失败,而严格模式将在这样的情况下抛出异常。
  7. 严格模式去除了with语句
  8. 不能修改arguments ,不能在函数内定义arguments变量 ,不能使用arugment.caller和argument.callee。因此如果你要引用匿名函数,需要对匿名函数命名

优点:

  1. 消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为;
  2. 消除代码运行的一些不安全之处,保证代码运行的安全;
  3. 提高编译器效率,增加运行速度;
  4. 为未来新版本的 Javascript 做好铺垫。

缺点:

  • 现在网站的 JS 都会进行压缩,一些文件用了严格模式,而另一些没有。这时这些本来是严格模式的文件,被 merge 后,这个串就到了文件的中间,不仅没有指示严格模式,反而在压缩后浪费了字节。

来和我一起刷3+1吧
gitHub: https://github.com/Renato-Z/exercises/blob/master/history.md

use strict是严格模式
优点:

  • 消除JS的一些不严谨、不合理的地方和一些怪异行为
  • 消除了代码一些不安全的地方、保证代码安全运行
  • 提高编译效率,增加运行速度
  • 为未来新版本做铺垫

缺点:

严格模式,其实就是更严格了

设立"严格模式"的目的,主要有以下几个:
- 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的Javascript做好铺垫。

我放几个常见的吧,详情可以去下面的文章中看

禁止this关键字指向全局对象
禁止在函数内部遍历调用栈
全局变量必须显式声明
arguments不再追踪参数的变化
(function(){
"use strict"
b=1//Uncaught ReferenceError: b is not defined
})()

严格模式,es5中新增,在严格模式下不能使用未声明的变量

在'use strict';后,必须更规范的写代码,且更容易发现代码中的错误

含义

ECMAScript 5的严格模式是采用具有限制性JavaScript变体的一种方式,从而使代码隐式地脱离“马虎模式/稀松模式/懒散模式“(sloppy)模式。顾名思义,这种模式使得Javascript在更严格的条件下运行

优点

  • 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为
  • 消除代码运行的一些不安全之处,保证代码运行的安全;
  • 提高编译器效率,增加运行速度;
  • 为未来新版本的Javascript做好铺垫

缺点

  • 某些代码在严格模式下会报错,尤其引入公用与第三方模块的时候需要注意

  • 有些严格模式的特性在不同浏览器的支持情况不同,需要注意兼容问题

为什么使用严格模式:

消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
消除代码运行的一些不安全之处,保证代码运行的安全;
提高编译器效率,增加运行速度;
为未来新版本的Javascript做好铺垫。
"严格模式"体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。

另一方面,同样的代码,在"严格模式"中,可能会有不一样的运行结果;一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行。掌握这些内容,有助于更细致深入地理解Javascript,让你变成一个更好的程序员。

严格模式,使用严格模式下 未声明的变量会报错,全局下的this不是window而是undefind.

严格模式,不怎么了解,记录一下,是为了缓解js语言全局变量特性提出的一种暂时性方案。

"use strict" 是 JavaScript 中的一个指令,用于启用严格模式(strict mode)。严格模式是一种更加严格的 JavaScript 解析和错误处理模式,它有以下特点:

  1. 变量必须声明:在严格模式下,变量必须通过 var、let 或 const 关键字进行声明,否则会抛出错误。

  2. 禁止使用未声明的变量:在严格模式下,使用未声明的变量会抛出错误。

  3. 删除变量或函数会报错:在严格模式下,无法通过 delete 操作符删除变量、函数或函数的参数。

  4. 禁止重复的参数名:在严格模式下,函数的参数名不能重复。

  5. 禁止使用八进制字面量:在严格模式下,八进制字面量(以 0 开头)无效。

  6. 保留字不能作为变量名:在严格模式下,保留字(如 implements、interface、let、package 等)不能作为变量名。

使用严格模式的优点包括:

  1. 更强的错误检查:严格模式下,会抛出更多的错误,帮助开发人员捕获潜在的错误和问题。

  2. 提高代码质量:严格模式要求使用更规范的语法和编码习惯,可以帮助开发人员编写更高质量、更易于维护的代码。

  3. 提升性能:严格模式下,由于禁止某些不推荐的语法和操作,可以提升代码的执行效率。

然而,使用严格模式也有一些缺点:

  1. 兼容性问题:严格模式可能与一些旧的 JavaScript 代码或库不兼容,需要进行适当的调整和修改。

  2. 限制了一些灵活性:严格模式下,某些不推荐的语法和操作被禁止,可能会限制一些灵活性和便利性。

总的来说,使用"use strict" 启用严格模式可以提高代码的质量和性能,帮助开发人员捕获错误。但在应用严格模式时,需要注意兼容性问题,并根据具体情况权衡是否使用。

严格模式
禁止this关键字指向全局对象
禁止在函数内部遍历调用栈
全局变量必须显式声明
arguments不再追踪参数的变化