如果我有ECMAScript/Javascript 6中的課程是否需要IIFE?
Class Car {}
我需要來包裝我們的功能關閉?瓦爾的窗戶被吊起來了嗎?或只是爲了課堂?什麼時候運輸? Traceur/babel將它變成IIFE並讓我們進入var's?
我需要:
(function(){
Class Car() {}
}());
爲了安全嗎?
如果我有ECMAScript/Javascript 6中的課程是否需要IIFE?
Class Car {}
我需要來包裝我們的功能關閉?瓦爾的窗戶被吊起來了嗎?或只是爲了課堂?什麼時候運輸? Traceur/babel將它變成IIFE並讓我們進入var's?
我需要:
(function(){
Class Car() {}
}());
爲了安全嗎?
你可以看看會發生什麼時,巴貝爾transpiles代碼here
你並不需要使用IIFE,除非你要隱藏的類,並獲取生成的var Class
懸掛爲任何變量:聲明將在開始時發生,但分配將發生在原始行中。
是的,巴別爾將let
變成var
,但它也照顧範圍的工程與預期的額外asignements預期。如果您只想編寫ES6代碼並執行它,則不必擔心這些細節,只需遵循ES6(ES2015)標準即可。
不,不需要像這樣包裝它,只要它在代碼中被視爲ES6模塊即可。 Babel的默認設置將輸入代碼和文件視爲模塊。 Babel確實在各個地方引入了函數來實現正確的範圍語義,並且如果啓用了適用的變換器,則會將let
轉換爲var
。
ES6模塊總是嚴格模式,這裏就是規範說,關於分配在嚴格模式:
分配到一個未聲明的標識符或以其他方式無法解決的引用不創建全局對象的屬性。在嚴格模式代碼中發生簡單分配時,其LeftHandSide不能評估爲無法解析的引用。
http://www.ecma-international.org/ecma-262/6.0/#sec-strict-mode-of-ecmascript
究竟你的意思是什麼?:通過
做無功的得到提升到[...]類?
如此處所示,不需要爲類汽車提供IIFE包裝,事實上,它將創建一個執行上下文並隱藏該頁面的其餘部分。
所以你只是把它作爲(不是小寫)
class Car(){}
瓦爾被以同樣的方式是之前仍然懸掛。它會被吊到執行上下文的頂部。如果代碼當前位於窗口的上下文中,那麼var就會結束。
類是而不是在ECMAScript 6中懸掛。所以該類只有在聲明後纔可用。
類獲得懸掛,這意味着*綁定*創建時進入範圍,但它沒有初始化。它表現得像'let'。 –
@FelixKling - 這就是它在MDN上所說的。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes「函數聲明和類聲明之間的一個重要區別是函數聲明是懸而未決的,類聲明不是。」我誤解了嗎?這似乎相當直接。 –
Mmh,我指的是在http://www.ecma-international.org/ecma-262/6.0/#sec-functiondeclarationinstantiation,第35步中寫的內容。但是我猜「提升」的含義與我的想法不同(也許?)。類和'let'聲明絕對不被認爲是規範中的HoistableDeclaration,所以我想我錯了。然而,即使規範似乎沒有明確描述「提升」這個詞。 –
這取決於您將文件作爲腳本還是作爲模塊加載。你如何加載文件? – loganfsmyth
本地化,這是一個非常好的問題。使用Edge進行測試,雖然我可以使用該類聲明的'car.js'文件和使用該類的'new-car.js'文件,但是如果我將'Car'記錄到控制檯中,它會向我顯示構造函數,但如果我登錄'window.Car',它顯示'未定義'。 – Buzinas
@Buzinas:這有點不同。詞法聲明('class','let'和'const')不會成爲全局對象的屬性。 –