我在new
上看到Promise.resolve
关键字'{错误'',但我很惊讶它有效!有人可以向我解释发生了什么,以及是否有任何方式忽略new
关键字?
new Promise.resolve(1)
查看operator precedence的MDN文档(特别是成员访问,函数调用和 new(无参数列表))和new
keyword,不应该是上面的抛出错误,因为我假设表达式正在被评估如下:
new (Promise.resolve(1))
我想我在这里遗漏了一些东西(很明显)。提前谢谢!
注意:使用bluebird库2.x
答案 0 :(得分:1)
new
实际上只是创建一个新对象,并调用给定的函数,并将this
设置为该对象。如果Promise.resolve
内部根本不使用this
,那么这没有任何区别。此外,如果给定的构造函数返回一个对象本身,那么new
创建的隐式对象将被丢弃,而使用返回的对象。
因此,new
引入了一个新的中间对象,由于resolve
返回Promise
,它将被丢弃,并将上下文设置为不同的对象有任何影响力。
答案 1 :(得分:1)
Here是一个很好的答案,用于描述new
运算符在JavaScript中的工作原理。
基本上发生的事情是Promise.resolve
被视为构造函数,但是构造对象被丢弃,因为Promise.resolve
返回一些东西(你的promise对象)。
在这种情况下,new
不会造成任何伤害,因为Promise.resolve
不依赖于对this
的访问权限,如果您愿意,可以简单地删除它。
相反,将new
添加到实例方法调用将导致非常奇怪的行为:
let x = Promise.resolve()
new x.then(() => console.log("Resolved")) // Will almost certainly throw an error