Javascript关闭没有加载?

时间:2014-01-24 02:12:29

标签: javascript closures

我正在创建一个简单的网站并尝试使用闭包编写我的Javascript代码。我的第一个目标是在页面加载时显示警告框。但这是失败的。我页面的头部包含:

<script src="js/dukegen.shell.js"></script>
<script src="js/dukegen.js"></script>
<script>
    window.onload = dukegen.init();
</script>

这是dukegen.shell.js:

dukegen.shell = (function() {
    vat initModule = function () {
        alert("STATRTED");
    };

    return {initModule: initModule};
}());

这是dukegen.js:

var dukegen = (function () {
    var init = function () {
        dukegen.shell.initModule();

    };
    return {init: init};
}());

当我加载页面时,dukegen.shell.initModule()中的执行错误(“Uncaught TypeError:无法调用方法'initModule'未定义”); 。我未经训练的眼睛无法发现问题。我的两个javascript文件都在同一个文件夹中。

5 个答案:

答案 0 :(得分:2)

var initModule = function () {
        alert("STATRTED");
    };

not vat。

答案 1 :(得分:0)

试试这个:

dukegen = (function (shell) {
    var init = function () {
        shell.initModule();

    };
    return {init: init};
}(dukegen.shell));

答案 2 :(得分:0)

更改包含脚本的顺序:

<script src="js/dukegen.js"></script>
<script src="js/dukegen.shell.js"></script>

执行js/dukegen.shell.js时,dukegen对象尚不存在,因此dukegen.shell = ...的赋值将引发错误。或者,如果由于某种原因该对象存在,您将使用第二个脚本覆盖。

另请确保修复所有语法错误(vat initModule = function () {)并使用window.onload = dukegen.init

答案 3 :(得分:0)

头部的片段是否正确?你要包括dukegen.shell.js,定义dukegen.shell,然后在dukegen.js中覆盖dukegen

答案 4 :(得分:0)

你想创建一个命名空间,好吗?但是你要覆盖它......我认为最好的方法是:

var dukegen = {}; //your namespace, ok?

//here we are adding an atribute to your namespace, not overwriting it like you did before
dukegen.main = (function () { 
        var init = function () {
            dukegen.shell.initModule();

        };
        return {init: init};
    }());

//and creating another module
dukegen.shell = (function() {
        var initModule = function () {
            alert("STATRTED");
        };

        return {initModule: initModule};
    }());
//bootstrapping your app
dukegen.main.init();

// and a tip, always use dependency inject to call another module, like this:
 dukegen.main = (function (myShellModuleOrAnyOtherModule) { 
            var init = function () {
                myShellModuleOrAnyOtherModule.initModule();

            };
            return {init: init};
        }(dukegen.shell));