在Javascript中查找时丢失对象引用

在Javascript中查找时丢失对象引用,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我正在为Google Chrome开发一个扩展,遇到了以下情况: 我正在尝试从同一个Google Chrome实例中打开的所有窗口获取所有现有选项卡。我设法获取它们并为自己构建一个包含相关数据的对象数组 当我使用console.log查看构造的数组时(保存以备将来使用),我可以看到对象的集合,但我不能引用它们(当我尝试时,我得到了未定义的对象) 我试图将数组保存在对象外部的容器中,但没有任何更改 你知道为什么当我试图查找对象时,对它们的引用消失了吗?谢谢 代码如下: (function(wind

我正在为Google Chrome开发一个扩展,遇到了以下情况:

我正在尝试从同一个Google Chrome实例中打开的所有窗口获取所有现有选项卡。我设法获取它们并为自己构建一个包含相关数据的对象数组

当我使用console.log查看构造的数组时(保存以备将来使用),我可以看到对象的集合,但我不能引用它们(当我尝试时,我得到了未定义的对象)

我试图将数组保存在对象外部的容器中,但没有任何更改

你知道为什么当我试图查找对象时,对它们的引用消失了吗?谢谢

代码如下:

(function(window){
    //defining a namespace
    var example = {
        bmarksmaster: (function() {
            var bmarksmaster = function() {
                return new bmarksmaster.fn.init();
            }

            bmarksmaster.fn = bmarksmaster.prototype = {
                    debug: false,
                    tabs: [],
                    constructor: bmarksmaster,

                    init: function() {
                        return this;
                    },

                    windowParser: function(ctx, filter) {
                        var local = ctx;
                        var filter = filter;
                        return function(wObj) {
                            if((wObj !== null) && (wObj !== undefined)) {
                                for(var idx in wObj) {
                                    var cw = wObj[idx];
                                    if((cw.tabs !== null) && (cw.tabs !== undefined)) {
                                        var cwtabs = cw.tabs;
                                        for(var tabIdx in cwtabs) {
                                                  local.tabs.push(filter(tabIdx, cwtabs[tabIdx]));

                                        }
                                    }
                                }
                            }

                        };
                    },

                    getTabs: function() {
                        var returnData = [];
                        chrome.windows.getAll(
                            {
                                "populate": true
                            }, this.windowParser(this, function(i, e) {
                                var data = {};
                                if(!e.incognito) {
                                    data["title"] = e.title;
                                    data['url'] = e.url;
                                    data['favicon'] = e.favIconUrl || "";
                                }
                                return data;
                            }));

                        return this.tabs;
                    },

                    getTab: function(callback) {
                        this.getTabs();
                        for (var tabIdx in this.tabs) {
                            if(callback(tabIdx, this.tabs[tabIdx])) {
                                return this.tabs[tabIdx];
                            }
                        }
                    },

                    getTabsData: function(callback) {
                        var data = [];
                        var tabs = [];
                        tabs = this.getTabs();
                        console.log(this.tabs[0]);
                        for (var tabIdx in tabs) {
                            console.log(tabs[tabIdx]);
                            var tabData = callback(tabIdx, tabs[tabIdx]);  
                            if(tabData) {
                                data.push(tabData);
                            }
                        }
                        return data;
                    },

                    setDebug: function() {
                        this.debug = true;
                    },

                    resetDebug: function() {
                        this.debug = false;
                    }
            };

            bmarksmaster.fn.init.prototype = bmarksmaster.fn;

            return bmarksmaster;
        })()
    };
    window.example = example;
})(window);
//end of bmarksmaster.js file

    console.log(example.bmarksmaster().getTabs()); //this works, I can see the array
    console.log(example.bmarksmaster().getTabs()[0]); //this doesn't work, I get undefined, never mind the shortcut

我认为你代码中的逻辑是错误的。这有点复杂,很难理解。我建议把它改写得更简单一点。像这样的事情可能会帮助你开始。它收集所有窗口,将所有选项卡放入
tabs
var

var tabs = [];
chrome.windows.getAll({ populate: true}, function(windows) {
  var localTabs = windows.reduce(function(a, b){
    return a.tabs.concat(b.tabs);
  });
  tabs = localTabs.filter(function(element){
    return !element.incognito;
  });
})

这看起来很奇怪:
var index=local.tabs.length;local.tabs[index++]=filter(tabIdx,cwtab[tabIdx])为什么要递增索引?另外,您可以发布来自
.getTabs()
的结果吗?来自.getTabs()的结果类似于这样(使用console.log):[{favicon:,title:,url:,},{favicon:,title:,url:,,,:}]编辑:我删除了您刚才提到的那段代码:)