TypeScript编译类如下:
var UrlProvider = (function(){
//tons of logic in here that only needs to be performed once for each UrlProvider instance
function UrlProvider(baseUrl){
var baseRequest = {
get: function(){return baseUrl;},
update: function(){return baseUrl;},
delete: function(){return baseUrl;}
};
var documents = function(){
var context = '/documents/';
return{
get: function(){return baseRequest.get() + context;},
post: function(){return baseRequest.post() + context;},
delete: function(){return baseRequest.delete() + context;}
}
};
var editors = function(){
var context = '/editors/';
return{
get: function(){ return baseRequest.get() + context; },
post: function(){ return baseRequest.post() + context; },
delete: function(){ return baseRequest.delete() + context; }
}
}
}
return UrlProvider;
})();
将逻辑放在UrlProvider构造函数之外,但在外部IIFE的闭包内有什么好处?我的想法是,如果我们需要一个远程服务或其他一些昂贵的过程来创建UrlProviders,那么它可能会更好地放置在外部闭包中而不是UrlProvider的构造函数中?它是否正确?将逻辑放在构造函数外部,但在IIFE内部是否有任何好处?
答案 0 :(得分:3)
将逻辑放在构造函数外部,但在IIFE中是否有任何好处
是。继承需要IIFE来捕获基类。如下所示
class Foo {
log() { }
}
class Bar extends Foo {
log() {
super.log(); // IIFE needed for `super` to work
}
}
查看生成的javascript(我删除了extends函数)。
var Foo = (function () {
function Foo() {
}
Foo.prototype.log = function () {
};
return Foo;
})();
var Bar = (function (_super) {
__extends(Bar, _super);
function Bar() {
_super.apply(this, arguments);
}
Bar.prototype.log = function () {
_super.prototype.log.call(this); // IIFE needed for `super` to work
};
return Bar;
})(Foo);
IIFE捕获了 _super
。原因是函数是唯一在JavaScript中创建变量作用域的东西,这就是为什么我们在codegen中创建一个IIFE以便以一个漂亮的本地名称(_super
)捕获基类。这是传统的JavaScript,并非特定于TypeScript。