我感觉很糟糕,因为很可能已经回答了这个问题,而我只是没有使用正确的搜索词。我对异步 JavaScript 很陌生。所以,我会先道歉。如果有人甚至可以帮助我获得正确的搜索词,我将不胜感激。
我正在尝试使用 Google 提要 API。当我按照 hello world 部分中列出的股票示例进行操作时,它就可以工作了。我正在尝试制作一些更具可扩展性的东西,以便我可以在多个地方使用它。所以我创建了一个对象...
function AlertRSS(num, url, div, date) {
this.num = typeof num !== 'undefined' ? num : 5;
this.url = typeof url !== 'undefined' ? url : 'http://arstechnica.com/author/caseyjohnston/feed/';
this.sel = typeof sel !== 'undefined' ? sel : '#alert';
this.date = typeof date !== 'undefined' ? date : this.getYesterday();
}
然后我尝试在方法内部调用对象...
AlertRSS.prototype.displayFeed = function() {
var retval = null;
var feed = new google.feeds.Feed(this.url);
feed.load(function(result) {
var tmp = this;
if (!result.error) {
for ( var i = 0; i < result.feed.entries.length; i++) {
var entry = result.feed.entries[i];
console.log(sel + ' <h2><a href="' + entry.link + '">' + entry.title + '</a></h2><br />');
$(tmp.sel).append('<h2><a href="' + entry.link + '">' + entry.title + '</a></h2><br />');
}
}
});
};
但是,似乎我无法从对象访问属性。我一直Uncaught ReferenceError: sel is not defined
在控制台中得到一个。
我认为这个问题与范围有关,但在这一点上,我觉得有点超出我的深度。非常感激任何的帮助。
更新
对于第一篇文章,这是一个讽刺。我的代码中有很多错误。两种回答都是正确的。但是,如果像我这样的另一个可怜的新手看到这个问题,我想把工作代码放在那里。
问题原来是var tmp = this;
线路的位置。它需要放置在内部回调函数之外才能工作。根据 Tomasz Nurkiewicz 的建议,我也var tmp
改为var that
. 工作代码如下:
function AlertRSS(num, url, sel, date) {
this.num = typeof num !== 'undefined' ? num : 5;
this.url = typeof url !== 'undefined' ? url : 'http://arstechnica.com/author/caseyjohnston/feed/';
this.sel = typeof sel !== 'undefined' ? sel : '#alert';
this.date = typeof date !== 'undefined' ? date : this.getYesterday();
}
AlertRSS.prototype.displayFeed = function() {
var feed = new google.feeds.Feed(this.url);
var that = this;
feed.load(function(result) {
if (!result.error) {
for ( var i = 0; i < result.feed.entries.length; i++) {
var entry = result.feed.entries[i];
console.log(that.sel + ' <h2><a href="' + entry.link + '">' + entry.title + '</a></h2><br />');
$(that.sel).append('<h2><a href="' + entry.link + '">' + entry.title + '</a></h2><br />');
}
}
});
};