当前位置: 首页 > 知识库问答 >
问题:

从事件处理程序回调调用的函数中'this'的值?

田远
2023-03-14

我已就有关守则作出评论。我通过反复试验发现,我必须在事件处理程序和命名回调中都使用bind,才能使事情正常工作。

NS.parsel({
    Name: 'MSimMenu',
    E: {
        hold_name:         '#hold_name',
        wrap_bottom:       '#wrap_bottom'
    },
    A: {
        time_out_id:        null,
        TIME_DELAY:         1000
    },
    init: function () {
        var self = this;
        self.E.hold_name.addEventListener(   "mouseover",   self.mouseOverTop.bind(self),    false);
        self.E.wrap_bottom.addEventListener( "mouseover",   self.mouseOverBottom.bind(self), false);
        self.E.wrap_bottom.addEventListener( "mouseout",    self.mouseOut.bind(self),        false);
        self.E.hold_name.addEventListener(   "mouseout",    self.mouseOut.bind(self),        false);
    },

    // callbacks

    mouseOverTop: function () {
        NS.clearTimeout(this.A.time_out_id);
        this.showBottom();
    },
    mouseOverBottom: function () {
        NS.clearTimeout(this.A.time_out_id);
    },        
    mouseOut: function () {

        // * this regards the question
        // bind is required here for hideBottom to have correct value of this

        this.A.time_out_id = NS.setTimeout(this.hideBottom.bind(this), this.A.TIME_DELAY);
    },

    // called from callbacks

    showBottom: function () {
        this.E.wrap_bottom.style.visibility = 'visible';
    },
    hideBottom: function () {
        this.E.wrap_bottom.style.visibility = 'hidden';
    }
});

共有1个答案

袁凌
2023-03-14

这是因为this是根据函数的调用方式确定的。对于settimeout回调,它不是在NS对象的上下文中调用的,而是作为一个独立的函数调用的。在本例中,this是未定义的,返回到全局对象。

关于绑定事件处理程序,您可能对另一种方法感兴趣,该方法使您的对象实现EventHandler接口。stackoverflower的一位同事最近建议,看看如何在JavaScript中实现DOM数据绑定的公认答案。

 类似资料:
  • 无法用fetch()响应完成。setstate() TypeError:无法读取未定义的属性“Set State” 我希望从事件处理程序错误截图中的回调中设置状态

  • 我正在尝试在javaFx中为特殊需要定制一个快捷方式系统。 这种特殊需求使得不可能使用KeyCombinaison(只限制一个键修饰符是不可接受的)。 我已经做了我适当的KeyCompin联络员系统,现在我想从节点调用一个处理程序(我在控制器之外)。但是我找不到任何优雅的解决方案来执行这个。 有一个按钮声明: 在我想从我的快捷方式代码调用控制器的操作之后。 和标准控制器。 我可以做一些工作,例如使

  • update 动画开始播放后,每帧都会触发此回调。 Type Parameters Info Function animation 返回当前动画对象 var updates = 0; anime({ targets: '.update-demo .el', translateX: 270, delay: 1000, direction: 'alternate', loop:

  • 我需要从OracleIdtyManager中的自定义后处理事件处理程序调用外部REST API? 如果有人有想法,请在这里发布。

  • 我需要检查用户在请求websocket连接时是否提供了有效的令牌。对于验证,调用验证服务器是必要的。我如何同步实现它,以便websocket处理程序不会在有答案之前结束。我正在使用vertx框架。

  • 主要内容:本节引言,1.什么是方法回调?,2.Android回调的事件处理机制详解:,本节小结本节引言 在3.1中我们对Android中的一个事件处理机制——基于监听的事件处理机制进行了学习,简单的说就是 为我们的事件源(组件)添加一个监听器,然后当用户触发了事件后,交给监听器去处理,根据不同的事件 执行不同的操作;那么基于回调的事件处理机制又是什么样的原理呢?好吧,还有一个问题:你知道 什么是方法回调吗?知道吗?相信很多朋友都是了解,但又说不出来吧!好了,带着这些疑问我们 对androi