【问题标题】:JS: What is 'this' coercion? What does use-strict have to do with that?JS:什么是“这个”强制? use-strict 与此有什么关系?
【发布时间】:2016-06-11 06:09:09
【问题描述】:

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

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

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

【问题讨论】:

  • 您对 Javascript 的this 了解多少? (解释必须从一般意义上的this 的基本用途开始,还是...?)
  • 您引用的文字似乎解释了“这种强制”的含义(在这种情况下)。你到底有什么不明白的?描述不是很准确:“在严格模式下,引用 null 或 undefined 的 this 值会引发错误。” 当然不是这样。访问this 本身不会引发错误。 this.something 会。
  • 这个link 可能会带来一些见解。
  • 哈哈,我正在看与这条线相同的视频

标签: javascript use-strict


【解决方案1】:

当你在 javascript 中调用一个函数时,'this' 将根据上下文引用不同的东西:

  1. 如果函数已经被绑定,'this' 将被设置为任何 它是必然的,例如fn.bind(x)()

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

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

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

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

  6. 如果您只是调用一个不在任何对象上的裸函数, 那不是绑定的,那不是箭头函数,你正在调用它 以直接的方式,不使用 call 或 apply,然后 this 将引用全局对象,如果您不是在严格模式下, 如果您处于严格模式,则未定义。这就是所指的 引用为“这种强制”。

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

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

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

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

控制台将记录undefined

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

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

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

适用于浏览器和节点,即使在严格模式下也是如此。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2011-03-28
    • 2019-07-22
    相关资源
    最近更新 更多