高级 JS 概念:与关键字 this 的幽会
介绍
在这个博客中,我将尝试解释可怕的 这个 以最简单的方式为您提供关键字。
这 这个 关键字是高级/中级 JavaScript 中最重要的概念之一,也是最容易被误解的概念之一。它也是 OOP(面向对象编程)和其他棘手概念(如调用、应用和绑定)的基础,我们稍后将在博客中涉及这些概念。
但首先,让我们解决 这个
那么,这到底是什么?
简单来说,tt是JavaScript中的保留关键字,它指向一个对象。它指向什么对象,取决于上下文以及函数的调用方式。
笔记 : 不能设置为变量的值。
重要的是要记住,每当在 JavaScript 中调用函数时,都会为其分配两个特殊关键字- ** 论据** 和 ** 这个** .
每次函数运行时,关键字 这个 是为该函数定义的,它存在于函数的执行上下文中。
理解 this 所指内容的四个规则
以下四个规则适用于此,以便知道此关键字引用了哪个对象。
- 全球范围
- 对象/隐式绑定
- 显式绑定
- “新”关键字
全球范围
这是四项规则中最广泛的规则,适用于 这个 存在于对象之外。
当我们看到 这个 在全局上下文中,它的值是指窗口对象。
这是一个有趣的小练习。转到浏览器的控制台日志 这个, 您必须看到正在返回的窗口对象。
对象/隐式绑定
第二条规则适用于 这个 在声明的对象内。在这种情况下, 这个 将始终指向其最近的父对象。
让我们用一些代码来理解这一点。
你认为这会是什么输出?
自从 这个 在 person 对象中声明,因为它有一个名为 firstName 的键,所以输出应该是“Hello Athar”
现在这里有一个问题来测试你到目前为止的知识。你认为 this 在这个函数中的价值是什么?
如果你猜到了 person2,那你就错了。
还记得这个重要的规则吗? 这个 在执行函数时定义。在这里,没有正在运行的函数,因此没有为此创建新值。因此, 这个 这里仍然会引用窗口对象。
现在让我们看另一个例子。这是一个嵌套对象。
你认为输出会是什么?
如果您到此为止的理解是正确的,那么您就已经猜对了。它将返回“Hello Undefined”,因为离 sayHelloToAthar() 函数最近的父对象是 anotherObj 对象,它指向那个对象。并且由于 anotherObj 对象没有名称键,它返回“Hello Undefined”。
但是如果我们希望 sayHelloToAthar() 方法返回“Hello Athar”呢?我们将不得不改变 这个 明确地。
这就是我们在博客的下一部分中学到的内容。
显式绑定
我们可以显式绑定或选择 这个 通过使用调用、应用和绑定方法。这称为显式绑定,因为 这个 被明确地传递给上述方法。
让我们从调用方法开始。
称呼
它调用给定的函数 这个 值和参数单独提供。
句法
这里的 thisArg 是我们希望 this 的值,即对象,而 argn 是函数的参数。
注意:需要注意的是 call 方法是立即调用的。
申请
apply 方法与 call 方法完全一样,只是它只需要两个参数,第二个参数始终是一个数组数组。
句法
注意:和 call 方法一样,即使是 apply 方法也会被立即调用。
绑定
bind() 方法创建一个新函数,在调用该函数时,将其 this 关键字设置为提供的值,并在调用新函数时提供的任何参数之前具有给定的参数序列。
句法
注意:与 call 和 apply 不同,bind 不会立即调用,而是返回一个函数定义,其值为 这个。
绑定非常重要,尤其是在处理异步代码时。
回顾一下,call、apply 和 bind 方法是非常强大的方法,可以让我们完全控制 这个 及其价值。它也优先于前面讨论的其他两条规则。
“新”关键字
new 关键字是一个相当高级的话题,但总结起来,它是一个创建新对象的保留关键字。它与函数一起使用,在函数内部,关键字 this 将引用新返回的对象。
让我们试着用一个例子来理解这一点
根据我们之前的规则之一,函数内部的 this 应该引用全局对象。但是由于我们使用的是 new 关键字,它返回一个带有它自己的对象 这个 关键词。
因此 这个 这里将指向对象。
结论
这是 javascript 中最重要但被误解的关键字之一。尽管这些规则不是 ECMAScript 官方文档的一部分,但它们应该可以帮助您理解 这个 关键字,尤其是在您刚开始时。
请在下面的评论部分告诉我你的想法。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
本文链接:https://www.qanswer.top/39160/33262511
标签:这个,函数,对象,绑定,幽会,关键字,调用,JS From: https://www.cnblogs.com/amboke/p/16727538.html