Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将服务传递给生命?_Javascript_Iife - Fatal编程技术网

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在组合根或应用程序入口点最有用,但除非您公开一个模块,否则我不会在其中声明对象。现在,您将无法在任何地方重用测试。