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

调用函数触发TypeError:this.myFunction不是函数的排查求助

解决TypeError: this.constructPoints is not a function的问题

我一眼就看出问题出在你传递OnSourceChanged作为回调的地方!咱们一步步拆解:

问题根源

当你写这段代码的时候:

const sourceNavContext:SourceNavContext = { 
  Items: this.sourceNavItems, 
  Context: this.fieldFormContext, 
  onRecordChanged: this.OnSourceChanged 
};

你把类的方法OnSourceChanged直接赋值给了onRecordChanged属性。当这个回调被触发时,它的this指向已经不再是你的类实例了——此时this会变成调用该回调的上下文(可能是全局对象或者undefined),自然找不到constructPoints这个类方法,所以抛出了TypeError。

而你在onDataSourceLoaded里调用this.constructPoints()是没问题的,因为这个方法是作为类的实例方法被调用的,this指向正确。

解决方案

这里有几种靠谱的修复方式,选一种你习惯的就行:

1. 用箭头函数定义OnSourceChanged

箭头函数会自动绑定当前类实例的this,不管怎么传递都不会丢失:

public OnSourceChanged = (source) => { 
  this.pageSource = source; 
  this.constructPoints(); 
}

这样再把它赋值给onRecordChanged时,this依然指向你的类实例。

2. 在构造函数中手动绑定this

如果不想改方法的定义方式,可以在类的构造函数里给OnSourceChanged绑定当前实例:

constructor() {
  // 绑定this到类实例
  this.OnSourceChanged = this.OnSourceChanged.bind(this);
}

之后不管怎么传递这个方法,this都会牢牢指向你的类实例。

3. 在赋值回调时用箭头函数包裹

也可以在创建sourceNavContext的时候,用箭头函数包裹住OnSourceChanged调用,间接绑定this:

const sourceNavContext:SourceNavContext = { 
  Items: this.sourceNavItems, 
  Context: this.fieldFormContext, 
  onRecordChanged: (source) => this.OnSourceChanged(source) 
};

这种方式不需要修改类方法的定义,适合临时场景。

验证修复

修复之后,当onRecordChanged触发时,this会正确指向你的类实例,this.constructPoints()就能正常调用了,那个TypeError也就消失啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:10:18