Aby uniknąć zanieczyszczenia globalnej przestrzeni nazw.
Jest to wzorzec klęski, w którym funkcje wewnętrzne mają dostęp do właściwości ich rodziców. Wg IIFE, ODNOŚNIK do funkcji wewnętrznych zwróconych.
Poniżej są dwa scenariusze, w których Iife wzór jest bardzo pomocne i powód, dlaczego maszynopis kompilator generuje Iife wzoru: Realizacja
- Dziedziczenie: gdzie przechodzi
BaseClass
jako argument Iife. Gdyby nie było IIFEE, to BaseClass
byłaby zmienną globalną, a więc zanieczyszczającą globalną przestrzeń nazw.
maszynopis:
class Greeter extends BaseController {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
JS:
var Greeter = (function(_super) {
__extends(Greeter, _super);
function Greeter(message) {
this.greeting = message;
}
Greeter.prototype.greet = function() {
return "Hello, " + this.greeting;
};
return Greeter;
}(BaseController));
- Moduł wdrożenie wzoru: gdzie aplikacja ma tylko jedną zmienną globalną jak ' "i wszystkie inne funkcje są pakowane w obiekty takie jak
app.cart
, app.catalog
itd. Tam tylko zmienna jest wyeksponowana przez moduły, a wszystkie inne funkcje są dodawane do samych modułów, co jest możliwe tylko przez IIFE.
maszynopis:
module App.Controller {
export class Greeter extends BaseController {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
}
JS:
var App;
(function (App) {
var Controller;
(function (Controller) {
var Greeter = (function (_super) {
__extends(Greeter, _super);
function Greeter(message) {
this.greeting = message;
}
Greeter.prototype.greet = function() {
return "Hello, " + this.greeting;
};
return Greeter;
}(BaseController));
Controller.Greeter = Greeter;
})(Controller = App.Controller || (App.Controller = {}));
})(App || (App = {}));
Kopiuj/Wklej ten kod do konsoli js przeglądarek i jedyną zmienną App zostanie utworzony w skali globalnej. Funkcja odpoczynku będzie dostępna w aplikacji.
Dzięki, mkdudeja
Prawdopodobnie uproszczenie kodu maszynopis, tak że nie trzeba zgadywać, kiedy potrzebuje Iife czy nie, to jest zaleta. To naprawdę nie ma znaczenia, prawda? Jeśli byłby to napisany ręcznie kod, miałbyś więcej punktów. –
Dla facetów, którzy głosowali, aby zamknąć to pytanie: To nie jest oparte na opiniach. Kompilator TS robi to w ten sposób, a pytanie brzmi: dlaczego. Zakładam, że jest przynajmniej jedna przyczyna tej decyzji. – Tarion