【问题标题】:Keyword new on static method Promise.resolve静态方法 Promise.resolve 上的新关键字
【发布时间】:2018-03-06 03:04:34
【问题描述】:

我在Promise.resolve 上看到了new 关键字的这种“错误”调用,但我很惊讶它有效!有人可以向我解释发生了什么,如果省略 new 关键字有什么不同?

new Promise.resolve(1)

查看 operator precedence 的 MDN 文档(特别是 Member AccessFunction Callnew(无参数列表))和 @ 987654322@,上面不应该抛出错误,因为我假设表达式是这样评估的:

new (Promise.resolve(1))

我想我在这里遗漏了一些东西(很明显)。提前致谢!

注意:使用 bluebird library 2.x

【问题讨论】:

    标签: javascript promise bluebird es6-promise


    【解决方案1】:

    new 实际上只是创建一个新对象并调用给定函数并将this 设置为该对象。如果Promise.resolve 内部根本不使用this,那没有区别。此外,如果给定的构造函数本身返回一个对象,则new 创建的隐式对象将被丢弃,而使用返回的对象。

    所以,new 引入了一个新的中间对象,由于resolve 返回一个Promise,它在这里被丢弃了,并且它将上下文设置为另一个似乎没有任何影响的对象。

    【讨论】:

    • 似乎没有任何影响除了额外的内存消耗和由于不必要的开销而导致的性能下降,当然
    • 我的意思是在功能方面
    • 这不是对您的回答的批评,更多的是向 OP 保证“错误”不应该用引号引起来,并且“它有效”不是接受这种做法的理由.
    【解决方案2】:

    Here 是一个很好的答案,描述了 new 运算符在 JavaScript 中的工作原理。

    基本上发生的事情是Promise.resolve 被视为构造函数,但是构造的对象被丢弃,因为Promise.resolve 返回了一些东西(你的承诺对象)。

    在这种情况下,new 没有任何害处,因为Promise.resolve 不依赖于对this 的访问,如果您愿意,可以简单地将其删除。

    相反,在实例方法调用中添加new 会导致非常奇怪的行为:

    let x = Promise.resolve()
    new x.then(() => console.log("Resolved")) // Will almost certainly throw an error
    

    【讨论】:

    • “基本上发生的事情是 Promise.resolve 被视为构造函数”你的意思是上面的表达式被这样评估:new (Promise.resolve)(1)
    • 在 JavaScript 中,一切的核心都是一个对象——所以new 不知道new Promise()new X() 之间的区别(其中X = Promise.resolve)。所以是的,虽然你的括号使代码看起来很奇怪,但它们暗示的评估顺序是正确的。
    猜你喜欢
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多