Javascript模块模式未捕获的参考错误

时间:2015-08-07 19:30:08

标签: javascript module

我一直关注this tutoral,当在ModuleTwo中引用Module作为参数时,一切正常直到我评论出模块

我的理解是双管||如果未定义,则空对象{}将创建一个空对象来代替Module,而是在控制台中出现错误。

var Module = (function () {

  var privateMethod = function () {
    // private
  };

  var someMethod = function () {
    // public
  };

  var anotherMethod = function () {
    // public
  };

  return {
    someMethod: someMethod,
    anotherMethod: anotherMethod
  };

})();

var ModuleTwo = (function (Module) {

    Module.extension = function () {
        // another method!
    };

    return Module;

})(Module || {});

2 个答案:

答案 0 :(得分:2)

当您将定义第二个模块的函数应用于(Module || {})时,如果Module之前未声明Module,则无法解析符号var ModuleTwo = (function(Module) { ... })(typeof Module == 'object' ? Module : {} ); ,这始终会提供JavaScript错误。如果您希望在没有第一个模块的情况下定义第二个模块,请尝试以下操作:

rowconfigure

答案 1 :(得分:2)

基本上,教程中存在错误。 rplantiko建议了一种让工作正常的方法,但是编写window.Module || {}代替Module || {}可能更容易。

这里的工作原理:

  • 访问任何对象的不存在的属性会产生undefined。但是,引用尚未声明的变量会产生ReferenceError(因此您的理解有点偏离)。
  • 浏览器将所有全局变量作为属性放到全局window对象上。本教程中的Module是一个全局变量,因为它在所有函数之外声明,因此您可以通过window.Module访问它,如果未定义(前一点),则不会导致ReferenceError。 / LI>

window显式分配给您定义的任何全局变量(例如,如果您打算将window.Module = (function () { …全局化,请执行Module)可能是一个好习惯,但这是有争议的讨论范围。