6

我在一个网站上阅读了以下内容:

使用严格有一个优势。它消除了这种强制。如果没有严格模式,对 null 或 undefined 的 this 值的引用会自动强制到全局。这可能会导致许多假头和拔出你的头发的错误。在严格模式下,引用 aa 这个 null 或 undefined 值会引发错误。

这到底是什么意思?use-strict 与this强制有什么关系?

4

1 回答 1

9

当您在 javascript 中调用函数时,“this”将根据上下文引用不同的内容:

  1. 如果该函数已被绑定,则“this”将设置为绑定的任何内容,例如fn.bind(x)()

  2. 如果您使用fn.call(x)or调用该函数fn.apply(x),则 this 将设置为 x。

  3. 如果函数是使用箭头符号定义的,那么this 将是定义this函数时定义的任何内容。

  4. 如果用 调用函数thing.fn()this则 '.' 之前的内容就是 'thing'。

  5. 如果您在构造函数中,则调用 with newthenthis指的是正在构造的新对象。

  6. 如果您只是调用一个不在任何对象上、未绑定、不是箭头函数的裸函数,并且您以直接的方式调用它,而不使用 call 或 apply,那么 this将如果您未处于严格模式,则引用全局对象,如果您处于严格模式,则引用 undefined。这就是引文所说的“这种强制”。

这就是为什么,如果您打开浏览器控制台并输入

Function('console.log(this)')()

控制台将输出 Window ,它是浏览器中的全局对象。但是,如果您打开控制台并输入

Function('"use strict";console.log(this)')()

控制台将记录undefined

我在这里使用 Function 构造函数,因为它是一种强制使用非严格模式的方法,无论它出现在什么情况下 - 所以这些示例仍然可以工作,即使你从文件或控制台中运行它们严格模式。

this强制可以是获取全局对象最方便的方式,即

const global = Function('return this')()

即使在严格模式下,也可以在浏览器和节点中工作。

但是大多数时候,您希望快速失败,并且您希望在特定类型的实例上运行的函数实际上在您的全局对象上运行可能会严重搞砸事情。在未定义的情况下尝试写入或读取this抛出异常几乎总是比读取和写入全局对象更好。

于 2017-04-09T19:38:06.133 回答