JS:什么是“this”强制转换?使用严格模式与此有什么关系?

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

使用严格模式(use-strict)有一个优势。它消除了this强制转换。没有启用严格模式时,对null或undefined的this值的引用会自动强制转换为全局对象。这可能会导致许多令人头痛和让人抓狂的错误。在严格模式下,对null或undefined的this值的引用会抛出错误。

这究竟意味着什么? use-strict与this强制转换有什么关系?

2
дҪ е·Із»ҸдәҶи§ЈJavaScriptдёӯзҡ„thisеҗ—пјҹпјҲи§ЈйҮҠжҳҜеҗҰйңҖиҰҒд»ҺдёҖиҲ¬ж„Ҹд№үдёҠthisзҡ„еҹәзЎҖзҹҘиҜҶејҖе§ӢпјҢиҝҳжҳҜ...пјҹпјү - nnnnnn
3
你引用的文本似乎解释了在这种情况下“this coercion”的含义。你具体不明白什么?这段描述并不是很精确:“在严格模式下,引用null或undefined的this值会抛出错误。” 当然这不是真的。访问this本身不会抛出错误,但访问this.something则会。 - Felix Kling
1
这个 链接 可能会提供一些见解。 - Abhijeet
哈哈,我正在看同一个视频,在那里提到了这句话。 - suku
1个回答

9
当你在JavaScript中调用一个函数时,'this'将根据上下文引用不同的东西:
  1. 如果函数被绑定,则'this'将被设置为绑定到的任何内容,例如fn.bind(x)()
  2. 如果你使用fn.call(x)fn.apply(x)调用函数,则这个'this'将被设置为x。
  3. 如果使用箭头符号定义了该函数,则this将是在定义函数时定义为this的任何内容。
  4. 如果您使用thing.fn()调用函数,则this是在'.'之前的内容,在此示例中为'thing'。
  5. 如果您在使用new调用构造函数,则this指的是正在构建的新对象。
  6. 如果您只是调用一个裸函数,它不在任何对象上,没有被绑定,不是箭头函数,并且您以简单的方式调用它,而不使用call或apply,则this将参考全局对象,如果您不在严格模式下,则this将指向未定义。这就是引用所谓的“这种强制”的原因。
这就是为什么,如果您打开浏览器控制台并键入 Function('console.log(this)')() 控制台将输出在浏览器中的全局对象Window。但是,如果您打开控制台并键入 Function('"use strict";console.log(this)')() 控制台将记录undefined
我在这里使用函数构造函数,因为它是一种强制使用非严格模式的方式,而不管它出现在哪种情况中 - 因此,即使您从内部运行它们时正在使用严格模式的文件或控制台,这些示例仍然应该工作。
'this'强制可以是获取全局对象的最方便的方法,例如: const global = Function('return this')() 在浏览器和节点中都可以使用,即使在严格模式下也是如此。
但是大多数情况下,您希望快速失败,并且在期望操作特定类型的实例的功能实际上在全局对象上操作时,可能会严重破坏事情。在未定义'this'时尝试写入或读取内容几乎总是比读取和写入全局对象更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接