2012-01-07 8 views
1

죄송합니다. 더 이상 제목과 관련이 없습니다.자바 스크립트 범위 문제, 익명 함수 내

URL에 사용 된 쿼리 문자열에 따라 사용자에게 다른 콘텐츠를 표시하는 웹 사이트 (개인)를 만들고 있습니다.

page=home.html 표시 할 home.html

각 값이 서로 다른 데이터를 포함, 일부 의사 코드와 자바 스크립트 객체 내부에 랩되는 웹 사이트 :

(function(){ 
    var wrapper = { 
     init: function(){ 
      //Runs on document ready 
      this.foo(); 
      this.nav.render(); 
     }, 
     foo: function(){ 
      //Some functionality goes here for the website, e.g. Display something from an API 
     }, 
     nav: { 
      //Functionality to handle the navigation, has different properties 
      config: { 
       //Contains the config for nav, e.g. page names + locations 
       dir: '/directory/to/content/', 
       pages: { 
        page_name: wrapper.nav.config.dir + 'page_value' 
       } 
      }, 
      render: function(){ 
       //some code 
      }, 
      routes: function(){ 
       //some code} 
      } 
     } 
    }; 

    $(function(){ 
     wrapper.init(); 
    }); 
})(); 

내 문제는 내가 각각에 dir 값을 씁니다 시도하고 있다는 점이다가 page의 값 (페이지가 정의 된 객체 내부)은 directory/to/content/page_value의 (이 의사 코드의 경우) 출력을 얻기를 기대하지만, 액세스하려고하면 dir은 정의되지 않습니다. 다음과 같이 원하는 것을 성취하십시오.

  • wrapper.nav.config.dir + 'page_value'

나는 마지막 30 분 내가 잘못하고, 심지어 생각하고있는 무슨을 알아 내려고 주위에 놀았 던 하드 코딩 각 페이지의 URL

내 로컬 개발 서버와 웹 호스트가 다른 디렉토리 구조를 갖고 있기 때문에 개발 + 게시 할 때마다 URL을 다시 쓰고 싶지 않습니다. 왜 모든 것이 객체 안에 싸여 있는지에 관해서는, 나는 이렇게 유지하는 것이 더 쉬울 것이라고 생각했다.

답변이 간단하고 아마추어 실수/이해 부족 일 수 있기를 바랍니다.

+2

? 위의 예에서는 그렇지 않습니다. – jfriend00

+0

성공을 거두지 않고 dir 속성에 액세스하려고 시도 했었습니다. – Daniel

+0

질문을 편집하여 사용하려고 시도했습니다. – Daniel

답변

2

문제는 바로 정의에 정의 된 변수를 참조 할 수 없다는 것입니다.

따라서 wrapper의 정의 내에서 wrapper을 참조 할 수 없습니다. 그리고 config의 정의 내에서 config 등을 참조 할 수 없습니다.

이 문제를 해결하기위한 일반적인 디자인 패턴은 데이터 구조 선언에서 가능한 한 초기화하고 나머지는 모두 .init()에서 자유롭게 액세스 할 수 있습니다. 에

+0

예, 단순히 오타입니다 – Daniel

+0

오케이, 구문 오타 (더 많은 질문이 있습니다)에 대해 알고 싶지 않다고 가정하면 대답을 업데이트했습니다. – jfriend00

+0

업데이트 주셔서 감사합니다. 구문 오타는 실제 소스에서 콘솔에서 오류가 발생하지 않으므로 의도 한대로 동작합니다. – Daniel

1

변경에게 처음 두 줄은 :

var wrapper = null; 
(function(){ 
    wrapper = { 

그렇지 않으면, 래퍼는 익명 함수의 로컬 변수입니다.

+0

익명 함수에서 모든 것을 래핑하는 이유는 전역 변수를 정의하는 것이 좋지 않다고 생각했기 때문입니다. 여전히 변경 사항을 적용했지만 여전히 래퍼가 정의되지 않았습니다. – Daniel

+0

이것은 문제와 아무 관련이 없습니다. OP가 익명 함수 밖에서 래퍼에 액세스해야하는 경우이 방법이 하나의 해결책 일 수 있지만 그 점은 전혀 문제가되지 않습니다. – jfriend00

+0

@ jfriend00 : "대신에 dir은 액세스하려고 할 때 정의되지 않았습니다. 원하는 것을 얻기 위해 다음을 시도했습니다."링크 또는 뭔가에 사용되는 동안 래퍼가 실제로 정의되지 않았기 때문에 이것이라고 가정했습니다. – Krizz

1

문제는 여전히 값을 요청할 때 래퍼를 정의하는 것이므로 아직 정의되지 않은 것입니다.

아래의 코드 역시 실패

var x = { 
    y:"1", 
    z:x.y 
} 
0

왜 :

코드`wrapper.nav.config.dir + 'page_value'`의 라인
//... 
init: function(){ 
    //Runs on document ready 
    this.foo(); 
    var config = this.nav.config; 
    for (var page in config.pages) { 
     config.pages[page] = config.dir + config.pages[page]; 
    } 
}, 
//...