如何将服务转交给IIFE?

atc*_*way 3 javascript iife

我currenlty有以下基本IIFEJavaScript:

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如果它的所有输入在被调用时被解析,因此传递值是不可能的(或者我可能必须serviceIIFE需要它的每个方法上创建一个参数)?

我试图阻止必须将服务传递给每个方法.如果可能的话,我想传递服务实例,但也许我的理解是关闭所以请纠正我,如果是的话.

Ori*_*iol 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);
})();
Run Code Online (Sandbox Code Playgroud)

请注意,如果调用Test(myService),则该this值将以sloppy模式为全局对象,或者在严格模式下为undefined.因此me.service = service会污染全局范围或抛出错误.只需删除它,或者可以实例化而不是调用:new Test(myService).