2017-09-25 13 views
0

newキーワードの「誤った」呼び出しがPromise.resolveにありましたが、うまくいきました!誰かが何が起こっているのかを私に説明してもらえますか?newというキーワードを省略することはどういう意味ですか?キーワードstaticメソッドの新機能Promise.resolve

operator precedence(特に 会員アクセス関数呼び出し新しい(引数リストなし))と new keywordためMDNのドキュメンテーションを見てみると
new Promise.resolve(1) 

、上記スローエラーいけない、私は仮定するので式は次のように評価されています:

new (Promise.resolve(1)) 

私はここに何か(明白)がないと思います。前もって感謝します!

注:

答えて

1

Hereは、newオペレータがJavaScriptでどのように動作するかを説明する非常に良い回答です。

Promise.resolveはコンストラクタとして扱われますが、Promise.resolveは何か(約束オブジェクト)を返すので、構築されたオブジェクトは破棄されます。

Promise.resolvethisへのアクセスに依存しないため、この場合、newは問題ありません。削除することもできます。

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

"本質的に何が起こっているのは、Promise.resolveがコンストラクタとして扱われているということです"上記の式が評価されていることを意味していますか?新しい(Promise.resolve)(1)? – jwgoh

+1

JavaScriptではすべてがオブジェクトであるため、 'new'は' new Promise() 'と' new X() '(' X = Promise.resolve')の違いを知りません。だからあなたの括弧はコードが非常に奇妙に見えるが、それが暗示する評価順序は正しい。 –

1

newが本当にちょうど新しいオブジェクトを作成し、そのオブジェクトへthisセットで指定した関数を呼び出しているブルーバードライブラリ2.xのを使用します。 Promise.resolveが内部でthisを使用していない場合、それは違いはありません。さらに、指定されたコンストラクタ関数がオブジェクト自体を返す場合、newによって作成された暗黙オブジェクトは破棄され、返されたオブジェクトが代わりに使用されます。

したがって、resolvePromiseを返すので、ここで破棄される新しい中間オブジェクトが導入され、影響を受けていないような別のオブジェクトにコンテキストが設定されます。

+0

はcourse_の、不必要なオーバーヘッドにパフォーマンスの余分なメモリ消費と減少の影響を_exceptを持っていないようです:

逆に、インスタンスメソッドの呼び出しにnewを追加することは非常に奇妙な動作が発生します。 –

+0

私は機能*で*を意味します。 – deceze

+0

あなたの答えの批判ではなく、「誤った」という言葉は引用符で囲まれてはいけない、そして「それはうまくいく」ということは、この習慣を受け入れることの正当性ではない、 –

関連する問題