我如何将此传递给javascript中的SetTimeout()函数?

时间:2016-03-22 21:57:49

标签: javascript

  var workViewer = {
    container: document.documentElement,
    popup: document.querySelector('.avgrund-popup'),
    cover: document.querySelector('.avgrund-cover'),

    init: function () {
        this.addClass(this.container, 'avgrund-ready');
        window.avgrund = {
            activate: this.activate,
            deactivate: this.deactivate,
            disableBlur: this.disableBlur
        };
    },
    activateModal: function (state) {
        setTimeout(function () {
            this.parent.removeClass(popup, 'no-transition'); //this line
            this.parent.addClass(this.container, 'avgrund-active');  //this line
        }, 0);
    },


    removeClass: function (element, name) {
        element.className = element.className.replace(name, '');
    }
};


module.exports = workViewer;

我想将 this 传递给setTimeout函数,有什么方法可以做到吗?

这是我的第一篇文章,如果我能以任何方式改进,请告诉我

2 个答案:

答案 0 :(得分:5)

有两种主要方式。第一个是保存对this的引用并改为使用它:

var self = this;
setTimeout(function() {
  self.parent.removeClass(popup, 'no-transition');
  self.parent.addClass(self.container, 'avgrund-active');
}, 0);

另一种方法是使用bind创建一个绑定到给定值的this的新函数。

setTimeout(function() {
  this.parent.removeClass(popup, 'no-transition');
  this.parent.addClass(this.container, 'avgrund-active');
}.bind(this), 0);

如果您在支持它们的环境中运行,您还可以使用arrow function

setTimeout(() => {
  this.parent.removeClass(popup, 'no-transition');
  this.parent.addClass(this.container, 'avgrund-active');
}, 0);

答案 1 :(得分:2)

您可以使用Function.prototype.bind()。它创建了与给定上下文有界的函数:

setTimeout(function () {
    this.parent.removeClass(popup, 'no-transition'); //this line
    this.parent.addClass(this.container, 'avgrund-active');  //this line
}.bind(this), 0);