对象,它们的实例和setTimeOut效果

时间:2011-05-14 08:01:09

标签: javascript object greasemonkey settimeout

所以我试图在javascript中学习面向对象的编程。

function doStock() {    //my class
var that = this;
var nAntiFreeze = null;   // timeout ID
var getContent = function(oInPageContainer) {  
    GM_log('Antifreeze, before clear ' +nAntiFreeze);
    //clearTimeout(nAntiFreeze);
    GM_log('Antifreeze, after clear ' +nAntiFreeze);
};

return {
    sLink : "",
    oList : "",
    sSplitOperator : ";",
    reset : function() {
        this.sLink = '';
        this.oList = '';
        this.sSplitOperator = ';';
        nAntiFreeze = null;
    },
    loadPage : function() {
        if (this.sLink.length == 0) return;
        if (this.oList.length == 0) return;
        nAntiFreeze = setTimeout(function(){GM_log(that); that.loadPage();},30000);
        GM_log('antifreeze ' + nAntiFreeze);
        getPageAsync2(this.sLink,false,getContent);  //GM_xmlhttprequest
    }
}

};

我的脚本在FireFox 4中的GreaseMonkey上运行。在我的代码中,我使用上面的函数/类来创建一个对象,如下所示。

var oStocker = new doStock();
oStocker.sLink = 'www.somepage.com';
oStocker.oList = 'some list, may be a string line or the array object';
oStocker.loadPage();

getPageAsync2函数调用GM_xmlhttprequest,然后将div容器内的结果页面内容返回给回调函数。

首先,一般性问题:在调用clearTimeOut函数后,nAntiFreeze的值不会重置为null或任何内容。这是正常的吗?

第二个问题:为什么当超时用完时,我收到错误that.loadPage() is not a function? GM_log(那)告诉我[object Object]。

此问题的某个人能够通过var that = this使其发挥作用。但为什么它不适合我呢? Custom Object calling Methods with setTimeout loses scope

编辑:第三个问题:如果我创建了一百万个对象会发生什么。当浏览器完成工作后,它们会摆脱它们吗?因为我确定无法释放它们,因为此对象使用异步ajax调用,这意味着我无法执行

var oStocker = new doStock();
oStocker.loadPage();
oStocker = null;

在我的对象完成工作之前,将调用oStocker = null。

由于

1 个答案:

答案 0 :(得分:1)

首先,nAntiFreezesetTimeout返回的原始值。您将该值传递回clearTimtout,以便知道要清除哪个超时。致电clearTimeout不会影响nAntiFreeze的价值。

其次,that.loadPage未定义,因为that在调用this时引用doStock()(它被称为带new的构造函数,它引用了新对象)。但是你的函数没有返回那个对象(即构造函数的this),它返回return之后loadPage()函数是一个方法的对象。换句话说,您正在引用错误的对象。

当您调用oStocker.loadPage()时,其this关键字引用oStocker对象,但传递给setTimeout的函数引用that,它具有构造函数{的闭包。 {1}}。

以下内容应该有效:

this

使用不返回其loadPage : function() { // Declare that here var that = this; if (this.sLink.length == 0) return; if (this.oList.length == 0) return; // If called as oStocker.loadPage(), this (and that) is // the oStocker object. nAntiFreeze = setTimeout(function(){GM_log(that); that.loadPage();},30000); GM_log('antifreeze ' + nAntiFreeze); getPageAsync2(this.sLink,false,getContent); //GM_xmlhttprequest } 的构造函数没有太大意义,您可以使用Richard Cornford的模块模式并使用闭包进行继承。