0

我正在仔细阅读JS中的承诺,并在记录“this”时得到了奇怪的输出。记录“this”的顺序影响了代码的输出。我原以为我知道“这个”是如何工作的,但显然我不知道。谁能帮我把下面的代码总结一下吗

常量用户={name:'Glad Chinda',country:'尼日利亚',job:'全栈工程师'};console.log(this);Promise.resolve(USER).then(USER=>console.log(USER.name));console.log(this);//输出//{}//{}//很高兴Chinda------------------------------------------------------------------//删除第一个console.log(this)常量用户={name:'Glad Chinda',country:'尼日利亚',职位:“全栈工程师”};Promise.resolve(USER).then(USER=>console.log(USER.name));console.log(this);//输出//{}//很高兴Chinda------------------------------------------------------------------//删除第二个console.log(this)常量用户={name:'Glad Chinda',country:'尼日利亚',job:'全栈工程师'};console.log(this);Promise.resolve(USER).then(USER=>console.log(USER.name));//输出//{}//很高兴Chinda------------------------------------------------------------------//删除这两个常量用户={name:“很高兴Chinda”,country:'尼日利亚',job:'全栈工程师'};Promise.resolve(USER).then(USER=>console.log(USER.name));//输出//很高兴Chinda
  • 全部的在这些案例中然后()回调函数最后求值;这就是承诺的作用。它与.
    – 波蒂
    评论 2019年7月7日15:53
  • 请查看所有这些console.log(this);对于范围,它们似乎都是当前发布在这里的顶级对象。 评论 2019年7月7日15:55
  • @MarkSchultheiss所以这意味着不管顺序如何,console.log(this)都将首先记录?
    – 罗尼
    评论 2019年7月7日15:59

2个答案2

重置为默认值
2

“这”是你目前工作的范围。你的问题似乎是你对承诺的理解。承诺以异步方式执行,这意味着在承诺处理程序中的日志记录将最后发生,因为它的执行被延迟,不会阻止程序的其余执行。

8
  • 哦,好吧,我想我现在明白了。非常感谢。我是个初学者,所以我就是不明白发生了什么。
    – 罗尼
    评论 2019年7月7日16:05
  • 与范围无关。(除非它位于箭头函数内部,即使如此,范围也仅用于确定哪个函数的使用。)这与函数的调用方式有关。由于我们没有被告知OP的函数是如何调用的(甚至根本不知道它是否在函数内部),我们实际上无法回答以下问题(尽管看起来他们只是被异步弄糊涂了,而且无关紧要。) 评论 2019年7月7日16:11
  • @RobinZigmond this是指它所属对象的关键字,在javascript中,它或多或少与scope相同。在这种特殊的情况下,代码看起来只是一个执行的js文件,所以这确实是范围。 评论 2019年7月7日16:23
  • @布莱恩60,这并不意味着“它所属的对象”,尽管我同意在一般情况下这是一个合理的解释。更重要的是,你说这个对象与函数的作用域有任何关系是错误的。首先,范围是词法的,因此在编写代码后就固定了(除非你在胡乱处理评估),而每次执行一个函数时,它可能是不同的,而且通常也是不同的,因为它在很大程度上取决于调用函数的方式。 评论 2019年7月7日16:30
  • 不知道你为什么发布这个链接,我很清楚如何在JS工作。这与范围无关,而且我在w3schools链接中也没有看到其他内容。(虽然这不会让我感到惊讶,但w3schools因不总是准确而臭名昭著。)如果我们在交易链接,我会提供这本书到目前为止,这是我见过的最好的解释(第二章在这方面最为相关)。 评论 2019年7月7日16:35
0

Promises异步执行,这意味着在promise.resolve()行之后的执行是并行的,而不是顺序的。您可以尝试这样做以获得清晰的理解:

Promise.resolve(USER).then(USER=>console.log(USER.name));Promise.resolve(USER).then(USER=>console.log(`${USER.name}->new entry`));

运行此代码并查看其功能。

1
  • 是啊,我终于明白了。它并行地执行其余代码,而不干扰序列,并按顺序执行承诺。非常感谢。
    – 罗尼
    评论 2019年7月7日16:13

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.