如何使用“的setTimeout”调用对象本身如何使用“的setTimeout”调用对象本身(How

2019-06-01 00:37发布

为什么我不能使用setTimeout的JavaScript物件?

Message = function () {

    ...
    ...        

    this.messageFactory = ...
    this.feedbackTag = document.getElementById('feedbackMessages');

    this.addInfo = function (message) {
        var info = this.messageFactory.createInfo(message); // create a div
        this.feedbackTag.appendChild(info);

        setTimeout('this.feedbackTag.removeChild(info)', 5000);
        // why in here, it complain this.feedbacktag is undefined ??????

    };
}

感谢Steve`s解决方案,现在它将如果代码是如下工作...因为“这个”之前实际上是指向内的setTimeout功能,它不能元研究信息。

Message = function () {

    ...
    ...        

    this.messageFactory = ...
    this.feedbackTag = document.getElementById('feedbackMessages');

    this.addInfo = function (message) {
        var info = this.messageFactory.createInfo(message); // create a div
        this.feedbackTag.appendChild(info);

        var _this = this;
        setTimeout(function() { _this.feedbackTag.removeChild(info); }, 5000);

    };
}

但是,为什么不`吨,如果我们做到这一点的工作:

Message = function () {

    ...
    ...        

    this.messageFactory = ...
    this.feedbackTag = document.getElementById('feedbackMessages');
    // public function
    this.addInfo = function (message) {
        var info = this.messageFactory.createInfo(message); // create a div
        this.feedbackTag.appendChild(info);

        delayRemove(info);

    };
    // private function
    function delayRemove(obj) {
        var _this = this;
        setTimeout(function() { _this.feedbackTag.removeChild(info); }, 5000);
    }
}

Answer 1:

尝试更换这行:

setTimeout('this.feedbackTag.removeChild(info)', 5000);

与这两条线:

var _this = this;
setTimeout(function() { _this.feedbackTag.removeChild(info); }, 5000);

注意:

从来没有过setTimeout一个字符串,因为这将调用eval (你应该只在必要时才使用)。 取而代之的是,通过setTimeout函数引用(这可以是一个匿名功能)。

最后,总是检查this关键字指向你认为它指向(见http://www.alistapart.com/articles/getoutbindingsituations )。

解决问题2:

我认为,对于正常功能, this被设置为window对象,不管它们声明的位置。 因此,代码移动到一个单独的功能将不会解决问题。



Answer 2:

一个更合适的方法是只通过这个作为参数传递给被称为超时功能:

function delayRemove(obj) {
  setTimeout(function(_this) {
      _this.feedbackTag.removeChild(obj);
    }, 5000, this);
}

你真的应该传递的obj作为参数为好,只是为了确保它是在范围(参数的数量是无限的):

function delayRemove(obj) {
  setTimeout(function(_this, removeObj) {
      _this.feedbackTag.removeChild(removeObj);
    }, 5000, this, obj);
}

HTML5和Node.js的扩展setTimeout函数接受被传递给你的回调函数的参数。 它具有以下的方法签名。

setTimeout(callback, delay, [param1, param2, ...])

由于setTimeout 实际上不是一个JavaScript功能您的结果可能跨浏览器的不同而不同。 正如我所说的,这是在HTML5规范我找不到任何支持的具体细节,然而。



Answer 3:

要回答你的最后一个问题:“为什么不`吨,如果我们做到这一点的工作”:

Message = function () {

...
...        

this.messageFactory = ...
this.feedbackTag = document.getElementById('feedbackMessages');
// public function
this.addInfo = function (message) {
    var info = this.messageFactory.createInfo(message); // create a div
    this.feedbackTag.appendChild(info);

    delayRemove(info);

};
// private function
function delayRemove(obj) {
    var _this = this;
    setTimeout(function() { _this.feedbackTag.removeChild(info); }, 5000);
}}

它不工作,因为你正在传递一个未定义的变量( info ),而不是定义的变量( obj )。 以下是更正功能:

function delayRemove(obj) {
var _this = this;
setTimeout(function() { _this.feedbackTag.removeChild(obj); }, 5000);}


文章来源: How to use “setTimeout” to invoke object itself