1

我写了一个 JavaScript 模块加载器,它在一个循环中定义了不同的模块。

function(moduleList) {
    var arr = [];
    for (i = 0, l = moduleList.length; i < l; i++) {
        var m = moduleList[i];

        define(m.guid, function() {
            return  {
                container : m.container,
                configuration : m.configuration,
                moduleId : m.id
            }
        });
        arr[i] = m;
    }
}

紧随其后的是下一个 for 循环,我在其中“需要”先前定义的模块..

for (i = 0, l = arr.length; i < l; i++) {   
   require([arr[i].id,arr[i].guid], function(module, moduleConfiguration) {
        core.utils.log("m.id: " + moduleConfiguration.moduleId);
        core.utils.log("init " + moduleConfiguration.moduleId, moduleConfiguration);

        module.init(moduleConfiguration);
    });
}

现在的问题是,在每个“require”块中,moduleConfiguration 和模块都是相同的。要进行“require”调用,它使用不同的 id,但结果总是相同的。

有人知道如何解决这个问题吗?

4

1 回答 1

1

我认为您的定义函数应该如下所示,以便“m”的范围正确:

function(moduleList) {
    var arr = [], i; // declare i!!!!
    function def(m) {
        define(m.guid, function() {
            return  {
                container : m.container,
                configuration : m.configuration,
                moduleId : m.id
            }
        });
    }

    for (i = 0, l = moduleList.length; i < l; i++) {

        var m = moduleList[i];

        def(m);
        arr[i] = m;
    }
 }

在您的代码中,所有这些模块回调共享相同的变量“m”。通过引入另一个函数(和另一个作用域),您可以确保每个回调都有自己的副本。

于 2013-04-08T13:14:08.987 回答