2017-09-25 69 views
0

我看到Promise.resolvenew關鍵字的這個「錯誤」調用,但我覺得很奇怪,它的作品!有人可以向我解釋發生了什麼,如果它不同,以任何方式省略new關鍵字?關鍵字新的靜態方法Promise.resolve

new Promise.resolve(1) 

縱觀MDN單證的operator precedence(特別成員訪問函數調用新的(沒有參數列表))和new keyword,應該不是上面扔的錯誤,因爲我承擔表達越來越像這樣評價:

new (Promise.resolve(1)) 

我想我在這裏缺少的東西(顯而易見)。提前致謝!

注意:使用藍鳥庫2.x的

回答

1

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 
+0

「本質上正在發生的事情是,Promise.resolve被視爲構造」你的意思是,上面的表達正在評估類似這樣的:'新(Promise.resolve)(1)'? – jwgoh

+1

在JavaScript一切,其核心是一個對象 - 所以'new'不知道'新無極()'和'新的X()'(其中'X = Promise.resolve')之間的差異。所以是的,雖然你的括號使代碼看起來很奇怪,但它們暗示的評估順序是正確的。 –

1

new實際上只是創建一個新的對象,並調用與this設置爲對象的給定函數。如果Promise.resolve沒有用到this的話,那麼沒什麼區別。此外,如果給定的構造函數本身返回一個對象,則由new創建的隱式對象將被丟棄,而是使用返回的對象。

所以,new引入了被丟棄在這裏,因爲resolve返回Promise一個新的中間對象,並將這方面的不同對象,它似乎並沒有產生任何影響。

+0

似乎並沒有對性能無關的內存消耗和減少任何影響_except因不必要的開銷,course_的。 –

+0

我的意思是*在功能*。 – deceze

+0

這不是你的答案的批評,更多的保證,OP的是「錯誤的」不應該用引號括起來,並說:「它的作品」不接受這種做法的理由。 –