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

鸿蒙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始终指向类实例,优先使用箭头函数
  2. 事件回调

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

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

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



来源:公众号
作者:Android技术之家
原文地址:https://mp.weixin.qq.com/s/DmPNMzOcZzW3SqcXdCsKTQ

来源: 互联网
本文观点不代表码客-全球程序员交流社区立场,不承担法律责任,文章及观点也不构成任何投资意见。

赞 ()

相关推荐

  • 置顶 开发项目接单群,免费入群了

    无论你是Android、ios、java、php,或者你是产品经理、老板,都可以免费入群接单或者发布项目,全程不收取任何费用。

    2025年02月21日 15点27分
  • 鸿蒙Next开发-普通函数和箭头函数 this指向的区别以及对UI刷新的影响

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

    2025年02月26日 23点14分
  • 深入探索ArkUI @Builder与@BuilderParam的进阶应用

    在ArkUI的组件化开发体系中,@Builder和@BuilderParam这对装饰器组合扮演着UI模块化的重要角色。二者的差异与配合体现了声明式UI的核心思想:

    2025年02月26日 23点12分
  • Deepseek推荐:Android 开发者需要掌握的系统知识大纲

    一、操作系统基础1. Linux 内核机制内容介绍 Android 基于 Linux 内核,核心机制包括进程管理、内存管理、文件系统、Binder 驱动等。

    2025年02月26日 23点09分
  • Android App 厂商角标适配

    本篇介绍一下笔者在维护IM应用时,设置App角标的相关经验。同时这里设置角标都是基于系统厂商的Launcher,没有适配三方的Launcher应用,因为我们统计下来发现近些年使用三方Launcher应用比较少了,大部分用户还是以系统Launcher为主。所在在我们的项目中,主要是适配各个厂商。

    2025年02月26日 23点07分
  • 鸿蒙Next-方法装饰器以及防抖方法注解实现

    以下是关于 鸿蒙Next(HarmonyOS NEXT)中 MethodDecorator 的详细介绍及使用指南,结合了多个技术来源的实践总结:

    2025年02月26日 22点58分
  • DevEco Studio常用快捷键以及如何跟AndroidStudio的保持同步

    DevEco Studio是华为推出的用于开发HarmonyOS应用的集成开发环境,它提供了丰富的快捷键以提高开发效率,以下为你详细介绍不同操作场景下的常用快捷键:

    2025年02月26日 22点56分
  • Android | 利用ItemDecoration绘制RecyclerView分割线

    RecyclerView.ItemDecoration 是 Android 提供的一种扩展机制,用于为 RecyclerView 的每个子项(Item)添加装饰(Decoration)。它通常用于绘制分割线、边距、背景等,目的是增强 RecyclerView 的显示效果。

    2025年02月26日 22点52分
  • Android 布局优化:利用 ViewStub 和 Merge 提升性能

    提升界面渲染性能是一个至关重要的任务,尤其是在应用启动时,渲染界面需要快速且流畅。为了优化 UI 渲染速度,Android 提供了许多工具,其中 ViewStub 和 Merge 标签是非常有效的布局优化手段。通过合理使用这两者,可以延迟加载不必要的视图、减少布局的嵌套层级,从而加速应用的启动和运行。

    2025年02月26日 22点47分
  • 玩转 ImageView.ScaleType:图片的缩放与裁剪技巧

    ImageView 是最常用的控件之一,它用于展示各种类型的图片。为了能够根据需求调整图片的显示效果,Android 提供了 ImageView.ScaleType 枚举,它可以灵活地控制图片如何适应 ImageView 的尺寸。本文将探讨 ImageView.ScaleType 的不同选项、使用场景及其实现技巧。

    2025年02月26日 22点45分
  • Android加快你的编译速度

    工欲善其事,必先利其器。如果每次运行项目都要花费5-10分钟,那人的心态都要崩了。

    2025年02月25日 15点40分
  • Flutter多渠道打包的解决方案(walle)

    我们的应用集成了TalkingData这个第三方工具来统计日活、事件等,需要在应用启动时初始化SDK,这个时候需要传入当前渠道,以便数据的统计。 由于最开始是用脚本一个个打包,一直想解决打包过慢的问题,但是网上大多教程是基于命令行参数或flavor,实质上并没有根本解决打包效率的问题。直到发现了文章的主角 walle。

    2025年02月25日 15点36分
  • Android-分享一个对RecyclerView二次封装的库(EasyRecyclerView)

    在日常的Android开发当中,我们肯定会有使用到RecyclerView的需求,这里分享一个对RecyclerView二次封装的开源库——EasyRecyclerView。它基本上满足基本的开发需求,希望能帮看文章的小伙伴提高开发效率。

    2025年02月25日 15点31分
  • Android原生系统真的那么好用吗?安卓原生系统吊打其他系统,因为有Google-Play,所以应用都是纯净的?

    实际方面,原生 Android 的最大优势是更新快速,对供应商特别是 Android 上游的补丁的合并速度非常快,几乎总能在第一时间更新。因为系统越原生,更新的代价就越小。反之,如果一个停止更新的原生 Android 其实是没有多大意义的,它失去了它最大的优势。

    2025年02月25日 15点30分
  • Application 作为 Dialog 的 Context?小心踩坑!

    大家好,相信大家在使用 Dialog 时,都有一个非常基本的认知:就是 Dialog 的 context 只能是 Activity,而不能是 Application,不然会导致弹窗崩溃:

    2025年02月25日 15点25分
  • Android 应用的线程世界:最少需要几个线程才能启动?

    这篇文章主要介绍了 Android App 中的多种线程,包括守护线程(如 Signal Catcher 等)、渲染线程、主线程、三方线程(如 OkHttp、Glide、ARouter 相关线程)等,还提及三方库中线程池的情况及可能存在的问题。

    2025年02月25日 15点13分

发表回复

评论列表

点击查看更多

    联系我们

    在线咨询: QQ交谈

    微信:dxmcpjl

    邮件:1529097251#qq.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    微信