当前位置: 代码迷 >> JavaScript >> Javascript模块模式未捕获参考错误
  详细解决方案

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

热度:63   发布时间:2023-06-07 15:55:49.0

我一直在关注教程,当在ModuleTwo中将Module用作参数引用时,一切正常, 直到我注释掉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 || {});

当您应用定义你的第二模块的功能(Module || {})符号Module不能,如果解决Module尚未早些时候宣布,它总是给人一种JavaScript错误。 如果即使在没有第一个模块的情况下也要定义第二个模块,请尝试以下操作:

var ModuleTwo = (function(Module) {
   ...
   })(typeof Module == 'object' ? Module : {} ); 

基本上,本教程中有一个错误。 rplantiko提出了一种使事情正常运行的方法,但仅编写window可能会更容易window.Module || {} window.Module || {}代替Module || {} Module || {}

这里的运作方式:

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

最好将您定义的任何全局变量显式分配给window (例如,执行window.Module = (function () { …如果您打算使Module成为全局变量),这是一个好习惯,但这是有争议的,不在本讨论范围之内。

  相关解决方案