【问题标题】:Used Javascript function object prototype wrapped in IIFE defined inside DomContentLoaded in HTML giving error在 HTML 中定义的 DomContentLoaded 中定义的 IIFE 中使用的 Javascript 函数对象原型给出错误
【发布时间】:2026-02-14 08:30:02
【问题描述】:

我定义了一个 IIFE,并在其中定义了一个功能对象及其原型,它用 DomContentLoaded 包装,但我无法在 html 中使用它。以下是js文件中的代码:

const DomLoad = (function(){
function ChangeData() {
    this.active = 'blue-color';
}
ChangeData.prototype.change = function(imagename, idname, colorname) {
    document.getElementById(this.active).classList.remove("active");
    this.active = idname;
    document.getElementById(this.active).className += " active";   
    document.getElementById("text").innerHTML = colorname;            
    document.getElementById("carimage").src='assets/'+imagename+'.jpg';
};     
var changedata = new ChangeData();})();document.addEventListener("DOMContentLoaded", DomLoad);

以下是 HTML 文件中的代码:

<div class="color-circle" id="grey-color" onclick="changedata.change('grey','grey-color', 'Grey')"></div>

报错:

TypeError:changedata 未定义

【问题讨论】:

    标签: javascript dom dom-events iife


    【解决方案1】:

    您在 IIFE 中定义和初始化 changedata,并且如您所知,使用 var 在函数内声明的变量仅作用于该函数,在其外部不可见。

    因此,当您在 IIFE 中 var changedata = new ChangeData(); 执行此操作时,它在全局上下文中不可见,因此您将获得 TypeError: changedata is undefined

    还有一个问题是您将执行 IIFE 的结果分配给 DomLoad,这将是 undefined,因为您没有返回任何内容,实际上它应该是函数引用本身。

    【讨论】:

    • 我试着在 IIFE 中添加了这个: var changedata = new ChangeData;返回更改数据;并且使用 DomLoad.check() 它可以正常工作,但出现一个错误属性“handleEvent”不可调用。
    【解决方案2】:

    您正在尝试访问超出范围的变量。您可以创建一个 getter,并调用它来访问 IIFE 内的“私有”变量。比如:

    return {
      getChangedata: function() {
        return changedata;
      }
    }
    

    在您的 IIFE 结束时可能会起作用。

    然后您可以使用DomLoad.getChangedata().change() 访问您的change 方法。

    【讨论】:

    • 我试着在 IIFE 中添加了这个: var changedata = new ChangeData;返回更改数据;并且使用 DomLoad.check() 它可以正常工作,但出现一个错误属性“handleEvent”不可调用。
    【解决方案3】:

    这对我有用

    "use Strict";
    (function(global){
    function ChangeData() {
        this.active = 'blue-color';
    }
    
    ChangeData.prototype.change = function(imagename, idname, colorname) {
        document.getElementById(this.active).classList.remove("active");
        this.active = idname;
        document.getElementById(this.active).className += " active";   
        document.getElementById("text").innerHTML = colorname;            
        document.getElementById("carimage").src='assets/'+imagename+'.jpg';
    };     
    
    global.changedata = new ChangeData();
    document.addEventListener("DOMContentLoaded", ChangeData,false);
    })(window);    
    

    【讨论】:

      【解决方案4】:

      您的 IIFE 不会返回任何内容,因此 DomLoadundefinedchangeData 也是 IIFE 中的局部变量,不能从内联事件处理程序中访问。你应该这样做

      const changedata = (function(){
          function ChangeData() {
              this.active = 'blue-color';
          }
          ChangeData.prototype.change = function(imagename, idname, colorname) {
              document.getElementById(this.active).classList.remove("active");
              this.active = idname;
              document.getElementById(this.active).className += " active";   
              document.getElementById("text").innerHTML = colorname;            
              document.getElementById("carimage").src='assets/'+imagename+'.jpg';
          };     
          return new ChangeData();
      });
      

      <div class="color-circle" id="grey-color" onclick="changedata.change('grey','grey-color', 'Grey')"></div>
      

      function DomLoad(){
          function ChangeData() {
              this.active = 'blue-color';
          }
          ChangeData.prototype.change = function(imagename, idname, colorname) {
              document.getElementById(this.active).classList.remove("active");
              this.active = idname;
              document.getElementById(this.active).className += " active";   
              document.getElementById("text").innerHTML = colorname;            
              document.getElementById("carimage").src='assets/'+imagename+'.jpg';
          };     
          const changedata = new ChangeData();
          document.getElementById("grey-color").addEventListener("click", function(event) {
              changedata.change('grey','grey-color', 'Grey');
          });
      }
      document.addEventListener("DOMContentLoaded", DomLoad);
      

      <div class="color-circle" id="grey-color"></div>
      

      【讨论】:

        最近更新 更多