我currenlty有以下基本IIFE在JavaScript:
var Test = (function(service){
var me = this;
me.service = service;
var my = {};
my.getData1 = function(){
return me.service.GetData1();
}
my.getData2 = function(){
return me.service.GetData2();
}
return my;
}());
Run Code Online (Sandbox Code Playgroud)
我希望能做的是以下内容:
var myService = new Service(); //code omitted but its a service class that gets data
var myTest = Test(myService);
Run Code Online (Sandbox Code Playgroud)
以上不起作用.该行var myTest = Test(myService);抛出一个错误:
测试不是一个功能
我也知道,在一个IIFE,必须传入值,因为它立即被调用,所以最后一行应该是这样的:
}(service));
我可以使这个代码工作,如果我只是删除Test是持有的全局变量IIFE,而是使其成为具有以下签名的全局函数:
function Test(service) {}
但是,我正在IIFE尝试并尝试防止污染全局范围.是否有可能我仍然可以使用它,因为我已经设计并传递了我Service以后的实例Test?或者它只能是一个IIFE如果它的所有输入在被调用时被解析,因此传递值是不可能的(或者我可能必须service在IIFE需要它的每个方法上创建一个参数)?
我试图阻止必须将服务传递给每个方法.如果可能的话,我想传递服务实例,但也许我的理解是关闭所以请纠正我,如果是的话.
如果要避免污染全局范围,则应将代码包装在IIFE中,而不是将函数转换为IIFE.这没用,然后很可能你不能称之为.
(function() {
var Test = function(service){
var my = {};
my.getData1 = function(){
return service.GetData1();
}
my.getData2 = function(){
return service.GetData2();
}
return my;
};
var myService = new Service();
var myTest = Test(myService);
})();
Run Code Online (Sandbox Code Playgroud)
请注意,如果调用Test(myService),则该this值将以sloppy模式为全局对象,或者在严格模式下为undefined.因此me.service = service会污染全局范围或抛出错误.只需删除它,或者可以实例化而不是调用:new Test(myService).