OOJavaScript和全局变量的奇怪行为

OOJavaScript和全局变量的奇怪行为,javascript,oop,global,Javascript,Oop,Global,我有一个这样的全局对象数组 var data = {}; data.meta = [{..},{..},{..}]; 然后我定义了一个Javascript类,如下所示: var ui = {}; ui.Ruler = function(d) { this.d = d; this.o = null; }; ui.Ruler.prototype.render = function () { console.log('render'); return this.o;

我有一个这样的全局对象数组

var data = {};
data.meta = [{..},{..},{..}];
然后我定义了一个Javascript类,如下所示:

var ui = {};
ui.Ruler = function(d) {
    this.d = d;
    this.o = null;
};

ui.Ruler.prototype.render = function () {
    console.log('render');
    return this.o;
};
我可以从dev控制台访问
data.meta
,它会显示它的内容。 然而, 当我初始化类的一个实例并将
data.meta
的对象传递给它时

var ruler = new ui.Ruler(data.meta[0]);
控制台给我一个错误:

未捕获的TypeError:无法读取未定义的属性“0”

而且,
data.meta
突然变得
undefined
。这怎么可能?我做错了什么?我希望
data.meta[0]
在实例化的
ruler
对象中可用。如果我不运行这一行,
data.meta
仍然被定义。有人能给我解释一下这里发生了什么事吗

看来一切都很好。 我试着在FF和Chrome中运行它-ok。 这是我的小提琴


(我不能评论)

不要使用
var
来声明全局变量。要使变量显式全局化,请将其定义为
window.data={}
,并将其称为
window.data
。我似乎在复制该问题时遇到了问题。你能提供一把小提琴吗?阅读错误信息<代码>数据已定义,但它没有
meta
属性。这意味着错误可能与您上面提供的代码无关(因为上面的代码正确地定义了
data
上的
meta
属性)是否被
数据
覆盖?这太奇怪了。我无法在JSFIDLE中复制它。当我执行
var-ruler=newui.ruler(data.meta)时
,即不选择对象,但传递整个数组,
data.meta
仍被定义(在对象外部)。但是:
ruler.d==未定义的
。然而,当我在运行完这段代码后,直接在控制台中执行
var-ruler2=newui.Ruler(data.meta[0])
时,它工作了,
ruler2.d==={…}
。好吧,真不好意思,我发现了-调用
var-Ruler=new-Ruler…
data.meta
尚未定义-它由一个异步请求填充,我忘记了等待答案执行
var-ruler…
。尴尬。
var ruler = new ui.Ruler(data.meta[0]);