如何从 canvas.onmousemove 函数外部访问全局变量?

Posted

技术标签:

【中文标题】如何从 canvas.onmousemove 函数外部访问全局变量?【英文标题】:How to access global variable from outside of canvas.onmousemove function? 【发布时间】:2021-05-17 16:47:11 【问题描述】:

我有一个由 chartJs 提供支持的画布来显示图表。我定义了一个 onmousemove 函数,如下所示 操纵变量

myVariable = false;
ctx: any;
@ViewChild("mychart") mychart;

ngAfterViewInit()

   this.canvas.onmousemove = function(e) 
      this.myVariable = true;
    ;

不幸的是,它显示 myVairable 未定义。我如何在 onmousemove 触发时访问此变量?我还尝试了如下所示的 bind(this),但没有成功。

 this.canvas.onmousemove = (function(e) 
                console.log(this.myVariable);
        ).bind(this)

Stackblitz 示例https://stackblitz.com/edit/angular-chart-js-zzqumr

【问题讨论】:

如果你使用箭头函数而不是 function(e) 我相信会解决它。函数有自己的 this 上下文,但箭头函数会自动绑定并且没有自己的 this。 【参考方案1】:
ngAfterViewInit() 
  console.log('A', this.myVariable)
  this.canvas.onmousemove = function(e) 
    console.log('onMouseMove', this.myVariable)
  

如果我正确理解你的例子,你会得到一个输出

A myValue
onMouseMove undefined

但你也想拥有onMouseMove myValue

您可以在 this 仍然可用时简单地存储它的引用,然后在您的 onmousemove() 处理程序中使用它

ngAfterViewInit() 
  const self = this
  console.log('A', self.myVariable)
  this.canvas.onmousemove = function(e) 
    console.log('onMouseMove', self.myVariable)
  

应该输出哪个

A myValue
onMouseMove myValue

【讨论】:

【参考方案2】:

function 有自己的this 上下文,因此在函数体内部调用this 访问的是函数而不是组件。 arrow function 不建立 this 范围,因此您可以从箭头函数内部以 this 的身份访问组件。

this.canvas.onmousemove = (e) => 
  this.myVariable = true;
  console.log(this.myVariable);
;

【讨论】:

以上是关于如何从 canvas.onmousemove 函数外部访问全局变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何从当前 Lambda 函数调用另一个 Lambda 函数?

如何从静态函数返回函数接口?

如何从父静态函数调用静态子函数?

如何从函数生成函数

如何从自定义函数中调用委托函数?

如何从Objective-C中的异步内部函数内部返回外部函数