如何将服务传递给IIFE

How to pass service to an IIFE?

本文关键字:IIFE 服务      更新时间:2023-09-26

我目前在JavaScript中有以下基本IIFE:

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的全局变量,而使其成为具有以下签名的全局函数,则我可以使此代码工作

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);
})();

请注意,如果调用Test(myService),则this值将是草率模式下的全局对象,或是严格模式下的未定义对象。因此me.service = service要么会污染全局范围,要么会抛出错误。只需删除它,或者实例化而不是调用:new Test(myService)

IIFE将执行该函数。由于函数返回my,因此实际上是将Test的值设置为my,即(Test=my)。您希望Test保存一个函数,而不是它的结果。你可以做一些类似的事情

var Test = function (someArg) {
    return function (someArg) {
        console.log(someArg);
    };
};
(Test())(12); //logs 12