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

JavaScript中CustomEvent传递变量异常问题求助

问题原因与解决方案

你遇到的问题核心是基本类型的值传递特性:当你创建CustomEvent时,detail.myVar存储的是testVar当时的数值5——因为Number是基本类型,赋值时会直接拷贝值,而不是引用。后续修改testVar的数值,不会影响已经创建好的事件对象里的detail内容,所以两次触发事件都会输出5。

解决方法一:每次触发前重新创建事件

如果不需要复用同一个事件实例,最简单的方式是每次触发事件时,重新创建CustomEvent,这样每次都会获取testVar的当前值:

var testVar = 5;

addEventListener('testEvent', (e) => {
    console.log("testVar:" + e.detail.myVar)
})

// 第一次触发
dispatchEvent(new CustomEvent('testEvent', {
    detail: { myVar: testVar }
}))

testVar = 2;

// 第二次触发,重新生成事件
dispatchEvent(new CustomEvent('testEvent', {
    detail: { myVar: testVar }
}))

解决方法二:用引用类型传递变量

如果需要复用同一个事件实例,可以把testVar放在一个对象里(对象是引用类型),这样事件detail里存储的是对象的引用,修改对象的属性会同步反映到事件的detail中:

var testObj = { value: 5 };

const myEvent = new CustomEvent('testEvent', {
    detail: { myVar: testObj }
})

addEventListener('testEvent', (e) => {
    console.log("testVar:" + e.detail.myVar.value)
})

dispatchEvent(myEvent)
testObj.value = 2
dispatchEvent(myEvent)

这两种方法都能实现你想要的输出效果,可根据实际场景选择:

  • 方法一逻辑简单,适合单次或少量触发的场景;
  • 方法二更适合需要多次复用同一事件实例的场景,但要注意对象引用可能带来的意外修改问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:05:19