【发布时间】:2011-05-14 08:01:09
【问题描述】:
所以我正在尝试学习 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(that) 告诉我 [object Object]。
这个问题的人可以通过使用var that = this 使其工作。但为什么它对我不起作用?
Custom Object calling Methods with setTimeout loses scope
编辑: 第三个问题:如果我创建一百万个对象会发生什么。浏览器完成工作后会摆脱它们吗?因为我肯定无法释放它们,因为这个对象使用异步 ajax 调用,这意味着我不能这样做
var oStocker = new doStock();
oStocker.loadPage();
oStocker = null;
oStocker = null 将在我的对象完成工作之前被调用。
谢谢
【问题讨论】:
标签: javascript object greasemonkey settimeout