我当前在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;
}());
我希望能够做到以下几点:
var myService = new Service(); //code omitted but its a service class that gets data
var myTest = Test(myService);
以上不起作用。第var myTest = Test(myService);
行会引发错误:
测试不是一个功能
我也知道在IIFE
中,必须传递值,因为它是立即调用所以最后一行应该是这样的:
}(service));
如果我只删除Test
作为持有IIFE
的全局变量,而是使其成为具有以下签名的全局函数,可以使此代码正常工作 p>
function Test(service) {}
但是,我正在使用IIFE
来尝试防止污染全局范围。是否有可能我仍然可以像我设计的那样使用它,并稍后将Service
的实例传递给Test
?或者它只能是一个IIFE
如果它的所有输入在被调用时被解析,那么传递值是不可能的(或者我可能必须在service
中为IIFE
中的每个方法公开一个参数{1}}需要它吗?
我试图阻止必须将服务传递给每个方法。如果可能的话,我想传递服务实例,但也许我的理解是关闭的,所以请纠正我,如果是的话。
答案 0 :(得分:5)
如果您想避免污染全局范围,您应该在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);
})();
请注意,如果调用Test(myService)
,则this
值将以草率模式为全局对象,或者在严格模式下为undefined。因此me.service = service
将污染全局范围或抛出错误。只需删除它,或者可以实例化而不是调用:new Test(myService)
。
答案 1 :(得分:2)
IIFE将执行该功能。由于您的函数返回my
,因此您实际上将Test
的值设置为my
,即(Test=my
)。您希望Test
保留一个函数,而不是它的结果。你可以做这样的事情
var Test = function (someArg) {
return function (someArg) {
console.log(someArg);
};
};
(Test())(12); //logs 12