javascript - Bir enum neden bir fonksiyona dönüştürülür?
Düşünün:
enum Colors {
Red,
Green,
Blue
}
Buna dönüştürülür:
var Colors;
(function (Colors) {
Colors[Colors["Red"] = 0] = "Red";
Colors[Colors["Green"] = 1] = "Green";
Colors[Colors["Blue"] = 2] = "Blue";
})(Colors || (Colors = {}));
Bu sonuçla ilgili çoğu soru TypeScript'te Enumlar: JavaScript kodu ne yapıyor? içinde cevaplanmıştır.
Cevapları alıntılıyorum:
Bu bir 'hemen çalışan fonksiyondur'
Ve konunun ilerleyen kısmında:
sanırım muhtemelen sadece şöyle diyebilirler:
var Colors; Colors || (Colors = {}); Colors[Colors["Cyan"] = 3] = "Cyan"; // ...ve kapanışı atla, ama belki hâlâ bir şeyi kaçırıyorum.
Yani soru şu: Bunu hemen çalışan bir fonksiyonla sarmalamanın sebebi ne?
Cevap #1
TypeScript'in IIFE (yani anında çağrılan fonksiyon ifadesi) kullandığını düşünüyorum çünkü değişken adı küçültülebilir. Eğer çok uzun bir enum adınız varsa, örneğin MySuperAmazingStatesNeededForWhateverIWantEnum, bu isim bir IIFE içinde sadece bir harfe küçültülebilir
// amazing_enum.js
var MySuperAmazingStatesNeededForWhateverIWantEnum;
(function MySuperAmazingStatesNeededForWhateverIWantEnum() {
MySuperAmazingStatesNeededForWhateverIWantEnum[MySuperAmazingStatesNeededForWhateverIWantEnum["Red"] = 0] = "Red";
MySuperAmazingStatesNeededForWhateverIWantEnum[MySuperAmazingStatesNeededForWhateverIWantEnum["Green"] = 1] = "Green";
MySuperAmazingStatesNeededForWhateverIWantEnum[MySuperAmazingStatesNeededForWhateverIWantEnum["Blue"] = 2] = "Blue";
})(MySuperAmazingStatesNeededForWhateverIWantEnum || (MySuperAmazingStatesNeededForWhateverIWantEnum = {}));
// amazing_enum.min.js
var MySuperAmazingStatesNeededForWhateverIWantEnum;!function e(){e[e.t=0]="Red",e[e.u=1]="Green",e[e.m=2]="Blue"}(MySuperAmazingStatesNeededForWhateverIWantEnum||(MySuperAmazingStatesNeededForWhateverIWantEnum={}));
IIFE olmadan küçültme o kadar etkili olmazdı
// amazing_enum.js
var MySuperAmazingStatesNeededForWhateverIWantEnum;
MySuperAmazingStatesNeededForWhateverIWantEnum || (MySuperAmazingStatesNeededForWhateverIWantEnum = {}),
MySuperAmazingStatesNeededForWhateverIWantEnum[MySuperAmazingStatesNeededForWhateverIWantEnum.Red = 0] = "Red";
MySuperAmazingStatesNeededForWhateverIWantEnum[MySuperAmazingStatesNeededForWhateverIWantEnum.Green = 1] = "Green";
MySuperAmazingStatesNeededForWhateverIWantEnum[MySuperAmazingStatesNeededForWhateverIWantEnum.Blue = 2] = "Blue";
// amazing_enum.min.js
var MySuperAmazingStatesNeededForWhateverIWantEnum;MySuperAmazingStatesNeededForWhateverIWantEnum||(MySuperAmazingStatesNeededForWhateverIWantEnum={}),MySuperAmazingStatesNeededForWhateverIWantEnum[MySuperAmazingStatesNeededForWhateverIWantEnum.t=0]="Red",MySuperAmazingStatesNeededForWhateverIWantEnum[MySuperAmazingStatesNeededForWhateverIWantEnum.u=1]="Green",MySuperAmazingStatesNeededForWhateverIWantEnum[MySuperAmazingStatesNeededForWhateverIWantEnum.m=2]="Blue";
Boyuttaki fark çok büyük.
