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

Created on 3 May 2019  ·  7Comments  ·  Source: haizlin/fe-interview

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

js

Most helpful comment

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

设立"严格模式"的目的,主要有以下几个:
  - 消除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

All 7 comments

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

设立"严格模式"的目的,主要有以下几个:
  - 消除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
})()

Was this page helpful?
0 / 5 - 0 ratings