多个文件的功能闭包相同

时间:2011-10-13 20:06:35

标签: javascript

我有一个庞大的功能,我想分解成多个文件。这是我的功能结构:

var myFunction = function (argument) {
   var private1, private2, private3;

   var gadget1 = (function () {
       // Play around with private1, private2, private3, argument

       return gadget1API;
   }());

   var gadget2 = (function () {
       // Play around with private1, private2, private3, argument

       return gadget2API;
   }());

   var gadget3 = (function () {
       // Play around with private1, private2, private3, argument

       return gadget3API;
   }());

   return myFunctionAPI;
}

此处命名小工具以将它们分布在多个文件上不起作用,因为它们都依赖于private1, private2, private3关闭内的myFunction。为此,我需要myFunction闭包来关闭3个不同的文件。

3 个答案:

答案 0 :(得分:1)

答案很简单:这是不可能的。

答案 1 :(得分:1)

你应该把它创建为一个对象,而不是一个闭包,并先加载它,如下所示:

function myObject(argument) {
   this.arg = argument;
   this.private1 = whatever;
   this.private2 = whatever;
   this.private3 = whatever;

   this.gadget1 = (function () {
   // Play around with this.private1, this.private2, this.private3, this.arg

       return gadget1API;
   }());

   this.gadget2 = (function () {
   // Play around with this.private1, this.private2, this.private3, this.arg

       return gadget2API;
   }());

   this.gadget3 = (function () {
   // Play around with this.private1, this.private2, this.private3, this.arg

       // return gadget3API; i don't see what this is for, so commented out
   }());

   return myFunctionAPI;
}

在你定义之后立即实例化

var myFunction = new myObject(theargument);

你可以像这样访问它的功能:

var something1 = myFunction.gadget3();

答案 2 :(得分:0)

您所看到的是一个完整的参数化模块系统。如果没有在JavaScript / ECMAScript的未来版本中包含它,也许通过参数化每个单独的小工具文件中的显式闭包环境来手动模拟所述闭包行为,然后将所有内容重新绑定在一起(即链接小工具)就足够了通过实例化小工具。

gadget1.js:

var gadget1 = function (env) {
   with (env) {
   // Play around with private1, private2, private3, argument

   return gadget1API;
   }
}

gadget2.js:

var gadget2 = function (env) {
   with (env) {
   // Play around with private1, private2, private3, argument

   return gadget2API;
   }
}

main.js:

var myFunction = function (argument) {
  var private1, private2, private3;
  var gadgetFns = [gadget1, gadget2, …];
  var gadgets = [];
  function closureEnvF() { this.argument=argument, this.private1=private1, this.private2=private2, this.private3=private3 };
  var closureEnv = new closureEnvF();
  for (var i = 0; i<gadgets.length; i++) {
     gadgets[i] = gadgetFns[i].apply(null, closureEnv);
  }
  return myFunctionAPI; 
}

这可以简化,具体取决于闭包环境中的所有元素是否都是开头的对象。这是一个很好的解决方法,但它确实说明了闭包不是魔术(只是一个函数加上一个隐式传递的闭包环境)。