javascript - 在 Javascript 中 'this' 没有按预期工作

标签 javascript dom this dom-events window-resize

我在一个名为 FL 的对象中创建了一个方法,即 connectEvent(),它的属性包括 event elfn。 当我使用该方法然后尝试访问 this.el 时,console.log() 显示 undefined,即使我已经分配了 windowel

为什么 this.el 未定义? this 不是应该引用对象 FL 吗?

JS:

var FL = {
    connectEvent : function(params) {

        var params = params || {};

        if (params.el.addEventListener) {
            params.el.addEventListener(params.event, params.fn, false);
        } else if (params.el.attachEvent) {
            params.el.attachEvent('on' + params.event, params.fn);
        } else {
            params.el['on' + params.event] = params.fn;
        }
    }
};

FL.connectEvent({ 
    event: 'resize', 
    el: window, 
    fn: function() {
        console.log('start on resize');

        console.log('wat is this.el? ', this.el);

        console.log('end on resize');
    } 
});

最佳答案

这是因为在事件监听器中(通常在大多数回调中)函数的“this”发生了变化。在事件监听器中,通常是触发事件的元素,在您的情况下,这实际上是您的“el”。要解决此问题,您可以执行以下操作:

var FL = {
    connectEvent : function(params) {

        var params = params || {};
        var listener = function () {
            params.fn();
        };

        if (params.el.addEventListener) {
            params.el.addEventListener(params.event, listener, false);
        } else if (params.el.attachEvent) {
            params.el.attachEvent('on' + params.event, listener);
        } else {
            params.el['on' + params.event] = listener;
        }
    }
};

FL.connectEvent({ 
    event: 'resize', 
    el: window, 
    fn: function() {
        console.log('start on resize');

        console.log('wat is this.el? ', this.el);

        console.log('end on resize');
    } 
});

这样,监听器函数会继承其创建时所在的上下文,因此它可以访问参数并且调用 params.fn() 会保留它的“this”。如果你还想获得事件回调的参数,你可以这样做:

var listener = function () {
     params.fn.apply(params, arguments);
};

最后一个相当于使用:

var listener = params.fn.bind(params);

,但也适用于旧版浏览器。

关于javascript - 在 Javascript 中 'this' 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20550310/

相关文章:

javascript - 从另一个文件更改javascript中的对象值

javascript - 如何延迟jquery悬停事件

javascript - Angular.js 最佳实践 - 扩展 Controller 、覆盖 Controller 默认值

javascript - 停止监听 Backbone 中的 DOM 事件

javascript - 在jstree中如何将指定的节点聚焦在一棵大树上?

Java HTML 对象

c++ - 如果字段通过引用传递,则类字段可以在 const 方法内修改吗?

Jquery (this) 选择器帮助

JavaScript 对象未正确发布到后端

java - 为什么我们可以使用 'this'作为实例方法参数?