TypeScript:accessouter";这";从一个嵌套的经典函数,而不是打破门楣;没有此别名;规则

TypeScript:accessouter";这";从一个嵌套的经典函数,而不是打破门楣;没有此别名;规则,typescript,typescript-eslint,Typescript,Typescript Eslint,我们在TypeScript项目中使用,它包括 这让我想知道如何从嵌套的经典函数访问外部this,而不违反这条规则 代码如下: class MyClass { name: string; target: EventTarget; constructor(name: string, target: EventTarget) { this.name = name; this.target = target; } initEventHandlers()

我们在TypeScript项目中使用,它包括

这让我想知道如何从嵌套的经典函数访问外部
this
,而不违反这条规则

代码如下:

class MyClass {
 
  name: string;

  target: EventTarget;
 
  constructor(name: string, target: EventTarget) {
    this.name = name;
    this.target = target;
  }
 
  initEventHandlers() {
    const self = this;
    function exampleEventHandler(this: EventTarget, e: Event) {
      console.log(this.somethingFromTheTarget);
      console.log(self.somethingFromMyClass);
    }
    this.target.addEventListener('exampleEvent', exampleEventHandler);
  }
}
从事件库调用事件处理程序函数,使用
fn.call(this,e)
this
设置为事件处理程序范围内的事件目标。显然,使用箭头函数在这里不适用

过梁存在
const self=this的问题

我知道这是允许的:
const{thisOneProperty}=this
,然后可以在嵌套函数代码中使用
thisOneProperty
。但是,当属性值更新时,这并没有什么好处

这同样有效:
constmyclass={t:This}
,然后我可以执行
myClass.t
来访问它。但那太难看了

那么,从事件处理程序函数中访问MyClass的
this
的“干净”方式是什么呢?

测试一下

class-MyClass{
名称:字符串;
目标:事件目标;
构造函数(名称:字符串,目标:EventTarget){
this.name=名称;
this.target=目标;
}
initEventHandlers(){
常数self={
somethingFromMyClass:this.somethingFromMyClass.bind(this)
};
函数exampleEventHandler(this:EventTarget,e:Event){
console.log(这是来自目标的.something);
console.log(self.somethingFromMyClass);
}
this.target.addEventListener('exampleEvent',exampleEventHandler');
}
}

这有什么原因不起作用吗?使用arrow函数并从类的
this.target
访问目标,而不是函数的
this
。我不确定我是否理解您在这里的意思“事件处理程序函数是从事件库调用的,使用fn.call(this,e)”您可以在arrow函数中捕获访问外部对象的代码,并在处理程序中调用该arrow函数,但如果与外部对象有更多的交互,这可能会变得很糟糕。@lindapaste我文章中的代码被简化了。在实际代码中,有许多目标,并且使用相同的处理函数。我提到了
fn.call(this,e)
只是为了显示通过将
this
设置为发出事件的对象来调用事件处理程序函数。