如何将服务转交给IIFE?

时间:2016-05-07 03:13:47

标签: javascript iife

我当前在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}}需要它吗?

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

2 个答案:

答案 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