Javascript对象中的变量范围

时间:2011-12-16 12:20:28

标签: javascript jquery object scope

我在JavaScript中发现了“对象”的概念。我正在制作一个RSS Parser,我有一个错误(评论)。

function MyParser (feed_url) {  // Construct
    "use strict";
    this.feedUrl = feed_url;
    this.pubArray = [];

    if (typeof (this.init_ok) == 'undefined') {
        MyParser.prototype.parse = function () {
        "use strict";
        var thisObj = this;
        $.get(this.feedUrl, function (data, textStatus, jqXHR) {
            if (textStatus == 'success') {
                var xml = jqXHR.responseXML,
                    //lastBuildDate = new Date($(xml).find('lastBuildDate').text());
                    items = $(xml).find('item');
                items.each(function () {
                    var pubSingle = thisObj.makeObj($(this).find('pubDate').text(),
                                                    $(this).find('link').text(),
                                                    $(this).find('title').text(),
                                                    $(this).find('description').text(),
                                                    $(this).find('encoded').text(),
                                                    $(this).find('commentRss').text(),
                                                    $(this).find('comments').last().text());
                    thisObj.pubArray.push(pubSingle);
                });
                console.log(thisObj.pubArray); // OK
            }
        }, 'xml');
        console.log(this.pubArray); // Empty
        return (this.pubArray);
    };

    MyParser.prototype.makeObj = function (pubDate, pubLink, pubTitle, pubDesc, pubContent, pubComCount, pubComLink) {
        "use strict";
        var pubSingle = {};
        pubSingle.pubDate = new Date(pubDate);
        pubSingle.pubLink = pubLink;
        pubSingle.pubTitle = pubTitle;
        pubSingle.pubDesc = pubDesc;
        pubSingle.pubContent = pubContent;
        pubSingle.pubComCount = pubComCount;
        pubSingle.pubComLink = pubComLink;
        return (pubSingle);
    };
}
this.init_ok = true;
}

如果查看console.log(),您会看到行// OK正在正确输出我的数组。

但是后来,从$.get返回时,我的数组是空的。

有没有人知道为什么,以及如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

这不是变量范围的问题。这里的问题是你正在使用异步流,而你没有正确思考流程。

让我解释一下:

当您执行.get时,您将触发一个并行异步进程,该进程将从浏览器请求信息,但您的主程序流程仍在继续,因此当您转到“return”语句时,您的数组尚未使用get方法的响应填充。

你应该在get回调中使用你的数组,而不是在它之外,因为你不能保证数组将拥有你需要的信息。

它有意义吗?

让我知道!

进一步说明

根据你的评论,你仍然在做这样的事情:

var results = MyParser(feed_url); //使用results.pubArray的代码

你不能这样做。即使你在.get回调中设置了“pubArray”,你也会在调用MyParser之后立即尝试使用pubArray,并且在调用.get回调之前。 您需要做的是从.get回调中调用您的程序逻辑的下一步...这是确保pubArray充满适当数据的唯一方法。

我希望这更清楚。

答案 1 :(得分:3)

这是因为你的行

 console.log(this.pubArray); // Empty
发出Ajax请求后直接调用

;它还没有时间来获取数据。这条线

console.log(thisObj.pubArray); // OK
在Ajax回调中调用了

,此时已经获取了数据。

答案 2 :(得分:0)

谢谢大家,特别是@Deleteman。

这是我做的:

$.get(this.feedUrl, 'xml').success(function () {
    thisObj.handleAjax(arguments[0], arguments[1], arguments[2]);
    $(document).trigger('MyParserDone');
}).error(function () {
    $(document).trigger('MyParserFailed');
});

然后,当我输入“HandleAjax”时,我回到了我的对象上下文中,所以“this”指的是我的对象和正确的属性。唯一的“问题”是我必须设置一个监听器(MyParserDone)以确保解析完成。