2013-04-11 32 views
0

我使用对象字面值来收集动态添加的各种DOM元素,因为我希望能够通过变量引用它们(下面的代码被简化了,将会有更多,如事件等等):JS对象字面范围和引用

ui = { 
    header : $('<div id="header"></div>').appendTo('body').css('color','#009'), 
    footer : $('<div id="footer"></div>').appendTo('body').css('color','#990') 
} 

现在,我希望我可以添加其他对象到这一点,但它会引发错误:

ui = { 
    header : $('<div id="header"></div>').appendTo('body').css('color','#009'), 
    footer : $('<div id="footer"></div>').appendTo('body').css('color','#990'), 
    headerSpecial : $('<span>some header</span>').appendTo(ui.header) // this line will cause an error "ui is not defined" 
} 

我想这是因为直到UI对象是关闭的,我可以” t引用里面的东西呢。所以我必须将这些东西分解成单独的对象。但有什么办法可以在单个对象中完成这一切吗?我应该用匿名函数包装一些东西然后给他们打电话吗?

+2

JSON是数据的*字符串表示*,恰好与JavaScript对象相似。你有什么是JavaScript对象文字,与JSON无关。 – 2013-04-11 22:12:09

+2

你的想法是正确的。当你尝试ser'headSpecial'时,'ui.header'还不存在。 – 2013-04-11 22:13:09

+0

我同意火箭。我不认为JSON的误解是造成这个问题的原因,但是当tim修复第一个问题并且尝试使用非字符串的字符串操作时,这将是一个重要的区别。 – AaronLS 2013-04-11 22:14:48

回答

2

而不是使用对象字面量,为什么不实例化匿名函数?

ui = new function() { 
    this.header = $('<div id="header"></div>').appendTo('body').css('color','#009'); 
    this.footer = $('<div id="footer"></div>').appendTo('body').css('color','#990'); 
    this.headerSpecial = $('<span>some header</span>').appendTo(this.header); 
}; 
+0

我喜欢它! + 1'ed! – tim 2013-04-15 22:34:21

5

使用同一个对象来保存引用是没有问题的,但是不能在同一个字面表达式中使用自引用。这样做分两步:

// create the object 
ui = { 
    header : $('<div id="header"></div>').appendTo('body').css('color','#009'), 
    footer : $('<div id="footer"></div>').appendTo('body').css('color','#990') 
} 

// add a new property to the object 
ui.headerSpecial = $('<span>some header</span>').appendTo(ui.header); 
+0

是的我知道这一点,这就是为什么我在这个问题中概述了这个想法,即:是否有办法在对象字面值内部做到这一点? – tim 2013-04-11 22:24:24

+1

为了公平起见,你说*“但是有什么办法可以在单个对象中完成吗?”*。这是一个对象。这个问题可以用一个文字来完成的简短答案是:不,不直接。较长的答案在这里:http://stackoverflow.com/a/4616273/218196。如果这是你真正想知道的,我们可以把这个问题作为另一个问题的重复来解决。 – 2013-04-11 22:25:53

+0

我真的很喜欢zzzzBovs解决方案。这让我真正想要的东西,并提醒我可以把功能作为变量。 – tim 2013-04-15 22:41:26