2013-04-11 3 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 오브젝트를 닫을 때까지, 내가 할 수 있기 때문에 아직 안에는 아무것도 참조하지 마라. 그래서 나는이 것들을 분리 된 객체들로 분리해야 할 것입니다. 그러나 단일 객체에서이 모든 것을 수행 할 수있는 방법이 있습니까? 익명의 함수로 몇 가지 내용을 싸서 호출해야합니까?

+2

JSON은 자바 스크립트 객체와 비슷하게 생기는 데이터의 문자열 표현 *입니다. 가지고있는 것은 JavaScript 객체 리터럴입니다. JSON을 사용하면 아무 것도 할 수 없습니다. –

+2

귀하의 생각은 정확합니다. 'ui.header'는 당신이'headerSpecial'을 시도 할 때 아직 존재하지 않습니다. –

+0

로켓에 동의합니다. 나는 tim이 첫 번째 문제를 해결하고 문자열이 아닌 문자열 연산을 시도 할 때 중요한 구분이 될지라도 JSON의 오해가이 문제의 원인이라고 생각하지 않습니다. – AaronLS

답변

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했습니다! – tim

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

+1

공평하게 말하자면, "하지만 한 가지 물건으로 모든 것을 할 수있는 방법이 있습니까?"* 이것은 하나의 객체입니다. 하나의 리터럴로이 작업을 수행 할 수 있는지에 대한 간단한 대답은 no입니다. 직접적으로 아닙니다. 더 긴 대답은 http://stackoverflow.com/a/4616273/218196입니다. 그것이 실제로 알고 싶다면, 우리는이 질문을 다른 질문의 사본으로 닫을 수 있습니다. –

+0

나는 zzzzBovs 솔루션을 정말 좋아합니다. 이것은 내가 정말로 원하는 것을 얻었고, 변수를 함수로 취급 할 수 있음을 상기시켰다. – tim