【问题标题】:Javascript closure not loading?Javascript关闭不加载?
【发布时间】:2014-01-24 02:12:28
【问题描述】:

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

<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: Cannot call method 'initModule' of undefined”); .我未经训练的眼睛无法发现问题。我的两个 javascript 文件都在同一个文件夹中。

【问题讨论】:

  • 试试window.onload = dukegen.init,没有括号。
  • 没有骰子。结果还是一样。

标签: javascript closures


【解决方案1】:
var initModule = function () {
        alert("STATRTED");
    };

不是增值税。

【讨论】:

  • 抱歉,什么是增值税?
  • @badgerduke: vat initModule = function () {(看看你的代码)
【解决方案2】:

更改包含脚本的顺序:

<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】:

    头部的 sn-p 是否正确?你包括dukegen.shell.js,定义dukegen.shell,然后覆盖dukegen.js中的dukegen

    【讨论】:

      【解决方案4】:

      试试这个:

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

      【讨论】:

      • 还是一样的结果。
      【解决方案5】:

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

      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));
      

      【讨论】:

      • 你尝试运行代码了吗?你会得到一个错误,因为dukegenundefined
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      相关资源
      最近更新 更多