JS:什么是'这个'强制? use-strict与此有什么关系?

时间:2016-02-28 04:17:21

标签: javascript use-strict

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

  

Use-strict具有优势。它消除了这种强制。没有   严格模式,引用此值为null或undefined为   自动强制全球化。这可能导致许多头部和   拉出你的头发那种虫子。在严格模式下,引用一个   null或undefined的值会引发错误。

这究竟是什么意思? use-strict与this胁迫有什么关系?

1 个答案:

答案 0 :(得分:7)

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

  1. 如果函数已绑定,则“this”将设置为any 它必然会,例如fn.bind(x)()

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

  3. 如果使用箭头符号定义函数,则this 将是函数所定义为this的任何内容 定义

  4. 如果您使用thing.fn()调用该函数,则this就是 在'。'之前,在这种情况下''''。

  5. 如果您使用new调用的构造函数,则this指的是 正在建设的新对象。

  6. 如果您只是调用一个裸函数,那就不在任何对象上, 没有绑定,这不是一个箭头功能,你正在调用它 以直截了当的方式,不使用电话或申请,然后 如果您没有处于严格模式,this将引用全局对象, 如果您处于严格模式,则为undefined。这就是所提到的 作为引用的“强制”。

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

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

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

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

    控制台将记录undefined

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

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

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

    即使在严格模式下,

    也可以在浏览器和节点中使用。

    但是大多数情况下,你想要快速失败,并且你希望在特定类型的实例上运行的函数实际上对你的全局对象进行操作会使事情变得非常糟糕。尝试向this写入内容或从中读取内容时,如果未定义异常则抛出异常几乎总是比读取和写入全局对象更好。