回调函数中的this值为undefined

如下代码,在横竖屏切换时,回调函数screenChange会抛异常,原因是this的值为undefined,为什么会出现这个问题呢?

async aboutToAppear()  {
  display.on('change', this.screenChange);
}

screenChange() {
  try {
    const currentDisplay = display.getDefaultDisplaySync();
    this.orientation = currentDisplay.orientation
    console.info('当前屏幕方向:', currentDisplay.orientation);
  } catch (err) {
    console.error('获取屏幕信息失败:', err);
  }
}
HarmonyOS
2025-10-22 10:39:42
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
hm688c720a9ea0c

将回调函数注册,修改为下面这样试试:

display.on('change', this.screenChange.bind(this));

或者

display.on('change', ()=>{
  this.screenChange()
});



一、display.on('change', this.function)的潜在问题

作用域丢失风险
直接传递 this.function作为回调时,方法内的 this可能不再指向当前类实例。在事件触发时,若未显式绑定作用域,this可能指向全局对象或 undefined,导致访问类成员时出错。

class Example {
  private data = 0;
  handleChange() {
    console.log(this.data); // 可能报错:this.data 为 undefined
  }
  registerEvent() {
    display.on('change', this.handleChange); // this 未绑定
  }
}
需手动绑定作用域
若必须使用类方法,需通过 .bind(this)显式绑定:

display.on('change', this.handleChange.bind(this)); // 正确绑定 this
二、display.on('change', () => {})的优势

自动绑定作用域
箭头函数 (() => {}) 会继承外层作用域的 this,确保回调内的 this始终指向当前类实例,避免作用域丢失问题:

display.on('change', () => {
  this.handleChange(); // this 正确指向类实例
  this.data = 100;     // 可安全访问类成员
});
灵活性更高
箭头函数允许在回调内直接编写逻辑或调用多个方法,无需额外封装:

display.on('change', () => {
  this.updateData();
  this.refreshUI();
});
分享
微博
QQ
微信
回复
7天前
相关问题
HarmonyOS SourceTool.xxxundefined
1224浏览 • 1回复 待解决
HarmonyOS Slider问题
994浏览 • 1回复 待解决
HarmonyOS 如何声明全局函数
1177浏览 • 1回复 待解决
Emitter如何声明函数类型
2708浏览 • 1回复 待解决
函数怎么写比较好
2498浏览 • 1回复 待解决
如何为 C++ 提供函数
3867浏览 • 1回复 待解决
组件自定义函数实现
1775浏览 • 1回复 待解决
HarmonyOS 页面间路由通讯改变
1101浏览 • 1回复 待解决
HarmonyOS 此方法如何转成vp
855浏览 • 1回复 待解决
Ability生命周期函数有哪些呢?
6923浏览 • 1回复 待解决