理解Babel 在函數呼叫中神秘的逗號運算子
在Babel 的編譯過程中,使用者觀察到導入的函式呼叫發生了逗號的轉換(,) 插入函數名稱之前。這種行為引發了有關此更改背後的目的和基本原則的疑問。
在檢查輸入和輸出程式碼範例時,很明顯Babel 的嚴格模式編譯會產生以下語法:
(0, _b.a)();
然而,在鬆散模式下,這種轉換不存在,只留下常規函數呼叫:
_b.a();
神秘之處在於逗號運算子的插入。為了解開這個謎團,我們需要深入研究負責這種轉換的程式碼。
經過調查,我們發現 Babel 使用逗號運算子來確保匯入的函數在全域物件的上下文中調用,或者如果啟用嚴格模式,則未定義。這是透過以下 JavaScript 程式碼實現的:
0; // Ignore result var tmp = _b.a; tmp();
本質上,逗號運算子建立一個臨時變數 (tmp),用於保存對導入函數 (_b.a) 的引用。透過呼叫 tmp() 而不是 _b.a(),Babel 確保在正確的執行上下文中呼叫該函數。
換句話說,「(0, _b.a)() 相當於呼叫_b.a 將此設為未定義(或非嚴格模式下的全域物件),這可以防止將this 意外綁定到_b,這可能會導致意外行為。
以上是為什麼 Babel 在嚴格模式下的導入函數呼叫前插入逗號運算子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!