2010-07-09 4 views
1
// i = inner, o = outer, f=function, a=attribute 
var singleton = function() { 
var iF = function() { 
    return this.oA; // returns undefined 
} 
return { 
    oF: function() { 
    this.oA = true; 
    return iF(); 
    }, 
    oA: false 
}; 
}(); 

singleton.oF(); 

싱글이었던 경우 (클래스 기반 언어 등) class, 내가 this.oA 통해 oA에 액세스 할 수 없습니다해야합니까?자바 스크립트 싱글 : 내부 함수에서 액세스 외부 속성

return singleton.oA; // returns true (as it should) 

나는 이유는 모르겠지만 singleton 기본 객체를 통해 oA를 액세스하는 나를 종류의 느낌 ... :

내가 iF에서 oA에 액세스 찾은 유일한 방법 일 것입니다 더러운. 내가 뭘 놓치고 있니? this.oA은 실제로 (범위의 관점에서) 무엇을 의미합니까?

+0

문제는'this'가 그 문맥에서'window'를 가리키고 있다는 것입니다. 그러나 여러분이 여기에있는 것이 정확히 무엇인지 확신 할 수 없습니다. –

답변

1

여기 요점은 입니다. 자바 스크립트에는 클래스가 없습니다.. 당신은 그들없이 살 필요가 있습니다. 중 일부만 특성으로 에뮬레이션 할 수 있습니다.

자바 스크립트의 this 키워드는 함수를 호출 한 객체를 나타냅니다. 전역 객체의 함수 인 경우 thiswindow을 참조합니다. constructor function이고 new 키워드로 호출하면 this은 현재 인스턴스를 나타냅니다.

oA을 공개로 유지하고 개인 기능에서 액세스하려면 간단하게 할 수 있습니다. 나는 괄호에 전체 싱글 기능을 감싸

// i = inner, o = outer, f=function, a=attribute 
var singleton = (function() { 

// public interface 
var pub = { 
    oF: function() { 
    this.oA = true; 
    return iF(); 
    }, 
    oA: false 
}; 

// private function 
var iF = function() { 
    return pub.oA; // returns public oA variable 
} 

// return public interface 
return pub; 
})();​ 

알 수 있습니다. 이 컨벤션이 인기있는 이유는 에게 함수가 즉시 실행되는지 (이 경우처럼) 도움이된다는 것입니다. 함수 이 더 커지면이되고 코드를 볼 때 은 확실하지 않습니다. singleton이 자체 호출 함수가 반환하는 함수 또는 함수 인 경우를 상상해보십시오. 그러나 괄호가있는 경우에는 함수가 즉시 반환하는 것이 Singleton이 될 것입니다.

+0

당신의 해결책이 자리하고 있습니다. paranthesis에 대한 메모를 보내 주셔서 감사합니다. –

관련 문제