当前位置: 首页 > article >正文

鸿蒙Next开发-普通函数和箭头函数 this指向的区别以及对UI刷新的影响

问题场景 

在项目中使用如下代码订阅全局事件

AppUtil.getContext().eventHub.on('theme', this.eventFunc);
eventFunc(theme:number){ this.xxx }//普通方法

这样实现this 的指向是调用该方法的对象即AppUtil,则不会触发UI的刷新

,找原因找半天原来是this 的问题 还以为是@State的注解使用有问题
正确使用方法如下
AppUtil.getContext().eventHub.on('theme', (t:number)=>{//这里需要使用箭头函数自动继承上下文的this 如果使用普通函数this指向的是调用该方法的对象即AppUtil,则不会触发UI的刷新。  this.xxx= t});
使用箭头函数后刷新UI正常了。

总结回顾 

在鸿蒙应用开发(基于ArkTS,即TypeScript的超集)中,普通函数和箭头函数的this指向行为与JavaScript/TypeScript一致,区别如下:


1. 普通函数(Function Declaration)

  • 动态绑定this的值由函数调用时的上下文决定。

  • 常见场景

    • 直接调用:非严格模式下this指向全局对象(如window),严格模式下为undefined

    • 对象方法调用this指向调用该方法的对象。

    • 构造函数调用this指向新创建的实例。

    • 通过call/apply/bind调用this指向绑定的对象。

示例
class MyClass {
  value: string = "Hello";

  // 普通函数
  printValue() {
    console.log(this.value); // 依赖调用时的上下文
  }
}

const obj = new MyClass();
const func = obj.printValue;
func(); // 错误:此时`this`指向全局对象,`value`为undefined

2. 箭头函数(Arrow Function)

  • 静态绑定this继承自定义时的外层作用域,且不可被修改call/apply/bind无效)。

  • 适用场景

    • 需要固定this指向(如事件回调、异步操作)。

    • 避免因上下文丢失导致的错误。

示例
class MyClass {
  value: string = "Hello";

  // 箭头函数
  printValue = () => {
    console.log(this.value); // 始终指向当前类实例
  };
}

const obj = new MyClass();
const func = obj.printValue;
func(); // 正确输出"Hello"

核心区别总结

特性普通函数箭头函数
this

指向

动态绑定,由调用方式决定

静态绑定,继承外层作用域的this

能否通过call/apply修改

适用场景

需要动态上下文的方法

需要固定上下文的回调、类属性方法

构造函数

可作构造函数(使用new

不可作构造函数


鸿蒙开发中的实践建议

  1. 类方法定义

    class MyComponent {
      count: number = 0;
    
      // 推荐:箭头函数绑定正确上下文
      handleClick = () => {
        this.count++; // 正确访问实例属性
      };
    }
  • 若需确保this始终指向类实例,优先使用箭头函数

事件回调

Button()
  .onClick(this.handleClick) // 使用箭头函数确保`this`正确
  • 事件处理函数(如按钮点击)需用箭头函数,避免this丢失。

避免全局污染

  • 在模块或类作用域内定义箭头函数,避免this指向全局对象。


通过合理选择函数类型,可以有效管理this指向,避免运行时错误,提升代码可维护性。

关注我获取更多知识或者投稿

0f782f27a308d54504ffcc105f079682.jpeg

db6f42577e316acf38a357a1334fda9a.jpeg


http://www.kler.cn/a/549929.html

相关文章:

  • vue3实战-----集成sass
  • 宝塔面板开始ssl后,使用域名访问不了后台管理
  • 16-使用QtChart创建动态图表:入门指南
  • C语言中printf()函数,格式输出符
  • Web 后端 HTTP协议
  • Flink在指定时间窗口内统计均值,超过阈值后报警
  • 架构设计系列(三):架构模式
  • 备战蓝桥杯 Day2 枚举 Day3 进制转换
  • FFmpeg源码:av_strlcpy函数分析
  • kamailio中的PV,PV Headers,App Lua,Dialog,UUID,Dianplan等模块的讲解
  • Unity状态机的实现方法二
  • Vue3(3)
  • 【Oracle】层次查询步骤,理解 where 条件执行顺序
  • 项目上传github步骤
  • DeepSeek与医院电子病历的深度融合路径:本地化和上云差异化分析
  • MATLAB图像处理:图像分割方法
  • 【go语言规范】关于接口设计
  • YOLOv11目标检测:解密mAP50与mAP的背后秘密
  • 代码随想录刷题攻略---动态规划---子序列问题1---子序列
  • java八股文-redis