跨多个文件的JavaScript模块模式

时间:2015-07-04 16:41:00

标签: closures

我不得不重新构建一些古老的代码,并且在很多不同的文件中有相当多的代码。方法是使用揭示模块模式,如JavaScript Module Pattern: In-Depth中所述(跨文件私有状态部分)。

第一个函数表达式效果很好,我可以在Firebug中看到函数组件也在第二个块中正确分配。但是变量突然变得不明确。

我整理了一个简化的example,控制台显示在第二次分配后变量未定义。

var test = (function ($, ns, undefined)
{
    function test1()
    {
        console.log("executing test1");
        ns.testx.test2();
    }
    return { test1: test1 };
}(jQuery, test || {}));

console.log(test);

var test = (function ($, ns, undefined)
{
    ns.testx = (function ()
    {
        function test2()
        {
        console.log("executing test2");
        }
        return { test2: test2 }
    })();
}(jQuery, test || {}));

console.log(test);

// DOM ready
$(function ()
{
    test.test1();
});

一些变体,例如在顶部定义变量一次也不起作用。如果交换了两个函数表达式,则执行测试1,但未定义ns.testx。

我担心我会错过那种令人眼花缭乱的显而易见的事情,并且非常想明白为什么这不起作用。我还需要让它工作,所以非常感谢任何帮助(将文件合并为一个不是一个选项)。

1 个答案:

答案 0 :(得分:0)

尝试

var test = (function ($, ns, undefined)
{
    function test1()
    {
        console.log("executing test1");
        ns.testx.test2();
    }
    ns.test1 = test1;
    return ns;
}(jQuery, test || {}));

console.log(test);

var test = (function ($, ns, undefined)
{
    ns.testx = (function ()
    {
        function test2()
        {
        console.log("executing test2");
        }
        return { test2: test2 }
    })();

    return ns;
    /*
      This will be
      {
        test1: test1,
        testx: {
          test2: test2
        }
      }
    */
}(jQuery, test || {}));