2011-10-13 29 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; 
} 

這大概可以根據在所有元素是否簡化封閉環境是開始的對象。這是一個相當大的解決方法,但它確實說明了閉包不是魔術(僅僅是一個函數加上隱式傳遞的閉包環境)。

相關問題