【问题标题】:Javascript "event handler" (function pointer) scope question? [duplicate]Javascript \"事件处理程序\"(函数指针)范围问题? [复制]
【发布时间】:2022-11-19 02:30:43
【问题描述】:

我对 javascript 很感兴趣,到目前为止我很喜欢它。我正在使用画布并在课堂上创建了一个基本的“按钮”小部件。我尝试使用函数引用作为参数来创建一种“事件”操作,但使用下面的模式,事实证明我可以触发“OnClick”,但范围很奇怪:“this”不是 cParentClass如我所料,看起来“this”就是 cButton。

有一个更好的方法吗?我有更多的运气 cParentClass 发送本身作为通用类目标,然后 cButton 调用 onclick 函数并将其自身作为参数发送(如果有多个按钮)。但这似乎还有很长的路要走?

有人可以帮助我理解为什么回调后“this”搞砸了吗?我想我会从你的回答中学到一些重要的东西。

谢谢!

class cButton{
    constructor() {
        this.handler_Click = null;
    }

    RegisterHandler_OnClick(handler) {
        this.handler_OnClick = handler;
    }

    HandleClick() {
        //console.log("cButton.HandleClick");
        if (this.handler_OnClick != null) {
           this.handler_OnClick();
        }
    }
}

class cParentClass()
{
    constructor() {
        this.button1 = new cButton();
        this.button1 .RegisterHandler_OnClick(this.OnClick);
    }

    OnClick()
    {
        console.log("clicked" + this.ParentClassMethod); // <-- doesnt work because "this" doesnt point to cParentClass, it points to cButton
    }

    ParentClassMethod()
    {
    }

}

【问题讨论】:

  • this 的值取决于函数的调用方式,而不是定义的位置(除非它是箭头函数)。
  • 你能稍微扩展一下吗?调用一个函数有哪些不同的“方式”?

标签: javascript


【解决方案1】:

只是想知道什么是this.parentclassproperty?为什么当您在 cParentClass 的构造函数中创建 button1 时添加参数,而在 Button 的构造函数中您没有分配参数?您是要添加此功能还是错误添加?顺便说一句,你不需要添加 () 来创建一个类。抱歉问了这么多问题。只是在寻找一些背景来回答这个问题。

【讨论】:

  • 哎呀谢谢你我的归结有一些错误,现在清理......
猜你喜欢
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
相关资源
最近更新 更多