Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将处于同一闭包下的对象分离到不同的文件中_Javascript_Closures - Fatal编程技术网

Javascript 如何将处于同一闭包下的对象分离到不同的文件中

Javascript 如何将处于同一闭包下的对象分离到不同的文件中,javascript,closures,Javascript,Closures,我对我的客户有以下结构: var myObject = (function(){ var mainObjectList = []; var globalObject = { init:function(mainObjectId){ var logger = {}; var utilityObject1 = {}; var utilityObject2 = {};

我对我的客户有以下结构:

var myObject = (function(){
    var mainObjectList = [];
    var globalObject = {
            init:function(mainObjectId){
                var logger = {};
                var utilityObject1 = {};
                var utilityObject2 = {};
                var mainObject = {};
                mainObjectList.push(mainObject);
            },//init
            someOtherMethods:function(){}
        };//globalObject
    return globalObject;
})();
对于我的客户,我可以说 myObject.init(5); 创建一个新的结构。 我的问题是在init函数闭包中有很多实用程序对象(logger、utilityObject1、utilityObject2..)。我的文件总数超过1000行,因此我希望将所有实用程序对象分离到不同的文件中,以获得更好的项目。例如,我可以将logger、utilityObject1和utilityObject2分离到它们自己的文件中。问题是,由于对象处于关闭状态,我不能将它们添加到单独文件中的主对象中。所以我想到了下面的注射方法

//start of file1
var myObject = (function(){
    var mainObjectList = [];
    var globalObject = {
            init:function(mainObjectId){
                var logger;
                var utilityObject1 = {};
                var utilityObject2 = {};
                var mainObject = {};
                mainObjectList.push(mainObject);
            },//init
            someOtherMethods:function(){},
            injectLogger:function(creator){
                this.logger = creator();
            }
        };//globalObject
    return globalObject;
})();
//start of file2
myObject.injectLogger(function(){return {};});

这样我就可以分离文件进行开发。但在生产中,我可以将文件连接成一个文件。但是我对这个设计有一些问题。我刚刚在myObject中添加了一个可访问的injectLogger函数。我的记录器现在不能在闭包中使用其他局部变量(我现在必须将它们传递给creator对象)。我的问题是,有没有其他方法将此类代码分离到文件中。(可能是一个外部工具。)

我喜欢使用谷歌的闭包编译器

如果您不想使用类似的东西,您可以尝试这样做:(确保首先加载globalObject.js来定义变量)

然后,您可以通过执行以下操作覆盖该函数:

//main.js
var myObject = new globalObject();
myObject.utilityFunction = function() {
    //new function
}
myObject.init(); // This will then use the new utilityFunction method you just set.
(function() {
    <?php require('foo.js.php');?>
})();

据我所知,您希望有一些词法变量,所有模块都将其关闭,但您希望将各个模块的代码保存在不同的文件中

实现这种精确行为的一种方法是通过将模块定义连接在一起来创建单个Javascript文件:

Header.js-partial Logger.js: 等 根据需要添加其他模块文件。它们可以引用词汇变量

Footer.js-partial })()

最后,您需要一个脚本,将所有这些文件连接到一个js文件中。在纯Javascript中,没有其他方法可以获得真正的词法变量访问

更好的选择 这就是说,这种技术已经成熟,容易引起混淆,我不推荐使用它。闭包通常用于关闭局部变量,而不是程序范围的变量。如果您使用1000行之前声明的词法变量,那么在运行程序时,您将花费一些时间跟踪所有变量的声明位置。相反,您可能应该在
globalObject
中包含私有的“全局”数据。例如,将
mainObjectList
存储在
globalObject.mainObjectList
中,并在模块文件中引用它


我推荐尼莫弗罗斯特所描述的解决方案。每个文件本身都应该是有效的javascript。

您可以使用命令行PHP作为预处理器来组合文件。例如,
main.js.php
可能如下所示:

//main.js
var myObject = new globalObject();
myObject.utilityFunction = function() {
    //new function
}
myObject.init(); // This will then use the new utilityFunction method you just set.
(function() {
    <?php require('foo.js.php');?>
})();

我处理这个问题的方法是检查全局对象是否存在,以及是否创建它。这样一来,订单就不重要了

// file 1
var Global_Obj = Global_Obj || {};  // creates empty global object
Global_Obj.An_Obj = { /* stuff */ };

// file 2
var Global_Obj = Global_Obj || {}; // uses created global object
Global_Obj.Another_Obj = { /* stuff */ };
(function() {
    <?php require('foo.js.php');?>
})();
<?php header('Content-type: text/javascript');?>
// file 1
var Global_Obj = Global_Obj || {};  // creates empty global object
Global_Obj.An_Obj = { /* stuff */ };

// file 2
var Global_Obj = Global_Obj || {}; // uses created global object
Global_Obj.Another_Obj = { /* stuff */ };