对象范围。为什么这会给出一个null对象

时间:2013-05-15 10:33:51

标签: javascript oop scope

initialize: function() {
    var store = {};
    var item = {};
    var me = this;

    Ext.Ajax.request({
        url: "some_valid_url",
        success: function(response) {
            try {
                var parser = new DOMParser();
                var xml = parser.parseFromString(response.responseText, "text/xml");

                store = Ext.create('Ext.data.Store', {
                    autoLoad: true,
                    fields: ['temp', 'low', 'high', 'desc', 'icon'],
                    data: xml,
                    proxy: {
                        type: 'memory',
                        reader: {
                            type: 'xml',
                            rootProperty: 'current',
                            record: 'day'
                        }
                    }
                });
                item = Ext.create("Ext.Container", {
                    var bla = "hello world",
                })
            } catch (err) {
                //err
            }
        }
    });
}

console.log("STORE AND ITEM");
console.log(item);
console.log(store);

为什么itemstore会回复null个对象?

但是我可以看到它正在解析一些数据,好像我将console.log放在storeitem元素之间,我会得到一个有效的元素。

STORE AND ITEM 
Object {} ArticleWeatherList.js:105
Object {} ArticleWeatherList.js:106

2 个答案:

答案 0 :(得分:1)

Ajax是异步的,这基本上意味着代码继续执行而不等待请求完成。因此,当您尝试使用项目和存储时,请求尚未完成,并且设置它们的成功方法尚未运行。绕过它的唯一方法是强制请求同步发生(尽管这通常是一个坏主意)或将所有依赖于请求的代码放入成功回调或从成功回调中调用的函数。

答案 1 :(得分:-2)

由于, 您已在store函数中声明itemintialize作为局部变量。如果要访问这些变量outisde,则必须在全局而不是函数中声明它们。同样可以在变量声明中省略var关键字。

initialize: function () {
        store = {};
        item = {};
        var me = this;
        ....

这应该有效但是被认为是一种不好的做法。