如何将服务传递给IIFE?

3

我目前在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); 报错:

Test 不是一个函数

我知道在一个立即执行的函数表达式(IIFE)中,必须传入值,因为它会立即执行,所以最后一行应该像这样: }(service)); 如果我只是删除全局变量 Test,并将其替换为以下签名的全局函数,则可以让此代码正常工作: function Test(service) {} 但是,我使用 IIFE 试图防止污染全局范围。我是否仍然可以按照我的设计使用它,并稍后将我的 Service 实例传递给 Test?或者,如果在调用 IIFE 时无法解析所有输入,则它只能是 IIFE 吗(或者我必须使 service 成为 IIFE 中每个公开方法的参数,需要它)?
我试图避免必须将服务传递给每个方法。如果可能,我想传递服务实例,但如果我理解有误,请纠正我。

3
为什么要使用IIFE而不仅仅是一个接受服务的普通构造函数?“我使用IIFE尝试防止污染全局作用域”,但是没有区别,Test仍将是全局变量。 - plalx
@plalx - 我对你的建议很感兴趣。我遇到的问题是,当我有一个构造函数 function Test(service) { this.myService = service},并尝试在稍后使用它时,例如在 my.getData1 这样的方法中使用 var result = this.carservice.GetData1();,我收到了 Cannot read property 'GetData1' of undefined 的错误提示。我认为这是因为 this 被绑定到创建的对象上,而不是按照我期望的方式工作。我有一个解决方法,就是将 this 分配给另一个变量,例如 var me = this。你认为呢? - atconway
@plalx - 没关系,可能想多了。只需传入服务并直接在调用中使用即可。无需像下面提到的那样传输。将其传递到构造函数后,直接在方法中使用即可。 - atconway
2个回答

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值将为全局对象,在严格模式下将为未定义。因此,me.service = service将污染全局范围或引发错误。只需删除它,或者实例化而不是调用:new Test(myService)

1
只是一点小提醒,但是IIFE主要在组合根或应用程序入口点处非常有用,但我不会在其中声明对象,除非您正在公开一个模块。现在您无法在任何地方重用Test。 - plalx

2

IIFE(立即调用函数表达式)将执行该函数。由于您的函数返回my,因此您实际上正在设置Test的值为my,即(Test=my)。您希望Test保存一个函数,而不是它的结果。您可以像这样做:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接