You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问addEventListener内部创建的对象?按钮触发对象获取异常解决

问题分析与解决

问题根源

你代码里的falseObject一直输出undefined,核心问题是查找时机错误:

  • CheckArrayModule初始化时,立刻执行了MainArrayModule.mainArray.find(...)查找status为false的对象,此时数组里只有初始的true对象,所以falseObject直接被赋值成undefined。
  • 后续点击按钮添加false对象后,falseObject变量不会自动重新查找更新——它的值在模块初始化时就固定死了。

修复方案

把查找对象的逻辑移到按钮点击的回调函数内部,每次点击按钮时才去数组里实时查找,而不是提前把结果存在变量里。

修改后的完整代码

<button id="btn-one">
  Add 'false' object
</button>
<button id="btn-two">
  Check for 'true' object
</button>
<button id="btn-three">
  Check for 'false' object
</button>

<style>
body {
  display: flex;
  height: 100vh;
  justify-content: space-evenly;
  align-items: center;
}
</style>

<script>
const button1 = document.querySelector('#btn-one');
const button2 = document.querySelector('#btn-two');
const button3 = document.querySelector('#btn-three');

const MainArrayModule = (() => {
  let mainArray = [];

  function MainArrayObjCreator(name, status) {
    return {name, status};
  }

  function createMainArrayObj() {
    let mainObj = MainArrayObjCreator('main', true);
    mainArray.push(mainObj);

    console.log(mainArray);

    button1.addEventListener('click', () => {
      let otherObj = MainArrayObjCreator('other', false);
      mainArray.push(otherObj);
      console.log(mainArray);
    });
  }

  return {mainArray, createMainArrayObj};
})();

const CheckArrayModule = (() => {
  MainArrayModule.createMainArrayObj();
  
  function logObject() {
    button2.addEventListener('click', () => {
      // 每次点击时实时查找true对象
      let trueObject = MainArrayModule.mainArray.find(object => object.status === true);
      console.log(trueObject);
    });

    button3.addEventListener('click', () => {
      // 每次点击时实时查找false对象
      let falseObject = MainArrayModule.mainArray.find(object => object.status === false);
      console.log(falseObject);
    });
  }

  return {logObject};
})();


const runFunctions = (() => {
  CheckArrayModule.logObject();
})();
</script>

额外优化建议(可选)

如果想让代码更模块化,避免重复写查找逻辑,可以给MainArrayModule新增两个获取方法,封装查找逻辑:

const MainArrayModule = (() => {
  let mainArray = [];

  function MainArrayObjCreator(name, status) {
    return {name, status};
  }

  function createMainArrayObj() {
    let mainObj = MainArrayObjCreator('main', true);
    mainArray.push(mainObj);

    console.log(mainArray);

    button1.addEventListener('click', () => {
      let otherObj = MainArrayObjCreator('other', false);
      mainArray.push(otherObj);
      console.log(mainArray);
    });
  }

  // 新增封装好的查找方法
  function getTrueObject() {
    return mainArray.find(object => object.status === true);
  }

  function getFalseObject() {
    return mainArray.find(object => object.status === false);
  }

  return {mainArray, createMainArrayObj, getTrueObject, getFalseObject};
})();

之后在点击回调里直接调用即可:

button2.addEventListener('click', () => {
  console.log(MainArrayModule.getTrueObject());
});

button3.addEventListener('click', () => {
  console.log(MainArrayModule.getFalseObject());
});

内容的提问来源于stack exchange,提问作者Gozman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:01:07