2011-10-13 32 views
2

我有一个很大的函数,我想分解成多个文件。这里是我的功能结构:同一个函数在多个文件中关闭

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个不同的文件。

+0

如果您不介意一个额外的步骤,您可以使用C预处理器('cpp')和'include'指令来组合您的JavaScript文件。与“ant”等构建工具一起,这是一块蛋糕。 –

回答

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

这大概可以根据在所有元素是否简化封闭环境是开始的对象。这是一个相当大的解决方法,但它确实说明了闭包不是魔术(仅仅是一个函数加上隐式传递的闭包环境)。

相关问题