This question already has an answer here:
Looking at this TypeScript code:
class Greeter {
greet() {}
}
It generates an IIFE (Immediately-Invoked Function Expression) around the constructor function and all prototype function declarations like:
var Greeter = (function () {
function Greeter() {
}
Greeter.prototype.greet = function () { };
return Greeter;
}());
What is the advantage here? When ever I read about IIFE I see a lot usage in defining modules. As far as I can see Typescript does not generate anything inside the IIFE that would pollute the global namespace.
In my opinion there is no advantage over this class declaration:
var Greeter = function () {}
Greeter.prototype.greet = function () { };
What is the reason for it?
That is interesting. I think the typescript compiler compiles
ClassDeclaration
deduced fromClassExpression
s, by assigning the expression to a variable in the scope, so they don't have to handle those cases independently. This simplifies the TypeScript compiler, and makes the generated code somewhat modular (I would say more readable, but that's just a matter of taste).Compiles into:
See, the
ClassDeclaration
is compiled as aClassExpression
assigned to a local variable.To avoid global namespace pollution.
Its a clousure pattern where inner functions have access to their parents properties. By IIFE, REFERENCE to inner functions returned.
Below are two scenarios, where IIFE pattern is quite helpful and the reason, why TypeScript Compiler generates IIFE pattern:
BaseClass
as an argument to IIFE. If IIFEE would not have been thereBaseClass
would be global variable, thus polluting the global namespace.TypeScript:
JS:
app.cart
,app.catalog
etc. There only variable is exposed through modules and all other features are added to the modules itself, which is possible by IIFE only.TypeScript:
JS:
Copy/Paste this js code to browsers console and only App variable will be globally created. Rest functionality will be under App.
Thanks, mkdudeja