所以我试图在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。
由于
答案 0 :(得分:1)
首先,nAntiFreeze
是setTimeout
返回的原始值。您将该值传递回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的模块模式并使用闭包进行继承。