Javascript 如何将服务传递给生命?
我目前在Javascript 如何将服务传递给生命?,javascript,iife,Javascript,Iife,我目前在JavaScript中拥有以下基本iLife: 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(); }
JavaScript
中拥有以下基本iLife
:
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)代码>引发错误:
测试不是一个函数
我还知道,在iLife
中,必须传入值,因为它会立即被调用,所以最后一行应该类似于:
}(服务))代码>
如果我只是删除Test
作为保存IIFE
的全局变量,而将其作为具有以下签名的全局函数,我就可以使此代码正常工作:
功能测试(服务){}
然而,我正在使用一个iLife
来试图防止污染全球范围。我是否仍然可以在设计时使用它,并在以后将我的服务的一个实例传递到测试中?或者它只能是一个IIFE
,如果调用它时它的所有输入都已解析,因此无法传递值(或者我必须在IIFE
中公开的每个需要它的方法上设置service
参数)
我试图避免将服务传递给每个方法。如果可能的话,我希望传入服务实例,但可能我的理解有误,请更正。如果您想避免污染全局范围,您应该将代码封装在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)
,则此
值将是sloppy模式下的全局对象,或者在strict模式下是未定义的。因此,me.service=service
将污染全局范围或引发错误。只需删除它,或者可以实例化而不是调用:newtest(myService)
iLife将执行该函数。由于您的函数返回my
,因此实际上是将Test
的值设置为my
,即(Test=my
)。您希望Test
保存函数,而不是其结果。你可以这样做
var Test = function (someArg) {
return function (someArg) {
console.log(someArg);
};
};
(Test())(12); //logs 12
为什么是IIFE,而不仅仅是一个接受服务的普通构造函数?“我用生命来阻止污染全球范围”没有区别<代码>测试
仍然是全球性的。@plalx-我对你的建议很感兴趣。我遇到的问题是,当我有,functiontest(service){this.myService=service
}作为构造函数时,我尝试稍后像var result=this.carservice.GetData1()那样使用它
在像my.getData1
这样的方法中,我得到了一个无法读取未定义的属性“getData1”。我想这是因为这个
绑定到创建的对象上,而不是按照我的方式工作。我有一个变通方法,将这个
赋值给另一个变量,比如var me=this
。你觉得怎么样?@plalx-没关系,可能是想得太多了。只需传入服务并在通话中直接使用即可。无需按照以下所述进行转移。在传递到构造函数后直接在方法中使用IIFEs是可行的。只是一个旁注,但IIFEs在组合根或应用程序入口点最有用,但除非您公开一个模块,否则我不会在其中声明对象。现在,您将无法在任何地方重用测试。