2011-05-04 8 views
5

초보자를 자바 스크립트로 보냅니다.자바 스크립트 범위 : 하위 멤버의 클로저를 참조하는 부모 개체 멤버

구성원 내에서 foo을 (를) foobar (으)로 말하면 어떻게합니까? foobar은 폐쇄 되었습니까?

var priv = { 

    foo: "bar", 

    foobar: (function() { 
     return this.foo === "bar"; 
    })() 

}; 

위의 코드는 실패합니다. 그 안에 this.fooundefined입니다. this.foopriv.foo으로 변경하면 여전히 undefined입니다. foobar 폐쇄에서 priv.foo을 어떻게 참조합니까?

+2

당신이 정말 폐쇄 전화를하고 싶어 : 그리고 당신은 여전히 ​​전화를해야하는 경우 foobarfoo 후 정의 할 수 priv.foobar();

로 호출 할 수 있을까? '()')' – meze

+0

다음에'()'를 제거하려고합니다. 불행히도, 나는 그렇게합니다. '포바 (foobar)'는 실제로 수십 줄이다. :/ – DotNetQuestionDate

+0

내 대답은 아래에 설명했다 – meze

답변

2

이 초기화 동안의 해상력에서 개체의 속성을 읽을 수 불가능 prev은 그 시점에서 정의되지 않습니다. 내부의 클로저를 호출 할 때 정의되지 않은 this 또는 priv을 참조합니다.

foobar: (function() { 
    return this.foo === "bar"; 
}) 

결국 ()없이을 :

은 아마 당신이 쓰고 싶었다.

var priv = { 
    foo: "bar" 
}; 

priv.foobar = (function() { 
    return priv.foo === "bar"; 
})() 
0

클로저가 정의되어 있지 않다는 문제가 있습니다. priv이 아직 초기화되지 않았으므로 함수에서 foo에 액세스 할 수있는 방법이 없다고 생각합니다.

정확히 무엇을하려고합니까? 다음은 샘플이해야 할 노력하고 내가 이해에 해당하지만, 내 생각 엔 내가 문제를 이해 아니에요입니다 :

// Set elsewhere 
var foo = "bar"; 

var priv = { 
    foo: foo , 
    foobar: foo == "bar" 
}; 
+0

요약하면, 나는 거대한 JS 파일이 있습니다. 그것은 몇 가지 개인 변수와 공용 객체를 정의합니다. 이러한 개인 변수를 하나의 객체로 캡슐화하려고하지만 다른 개인 변수는 다른 개인 변수의 값에 의존합니다. 대신에'foobar'는'foo'의 값을 기반으로 한 동적 인 계산입니다. 이해가 되니? – DotNetQuestionDate