2013-09-02 3 views
0

질문이 있습니다. 우리 모두는 Javascript로 클로저의 힘을 알고 있으며 나는이 힘을 사용하고 싶습니다. "BRB"라는 이름의 객체가 있다고 가정 해 보겠습니다. 내가 원하는 것은 사용자가 메소드 getBrowser()를 처음 호출 할 때마다 브라우저 버전/이름을 찾은 다음 반환하고 getBrowser()가 동일한 값을 반환해야 할 때 static으로 내부에 저장합니다. 값은 이미 정적으로 어딘가에 저장되어 있으므로 계산하지 않아도됩니다. 이것은 여러 가지 방법으로 수행 할 수 있습니다. 객체에 속성을 저장할 수 있습니다. 첫 번째 호출에서는 값을 설정하고 나중에 사용하기 때문에 객체가 생성 될 때 getBrowser 메소드를 직접 실행할 수 있습니다.자바 스크립트의 정적 값 닫기

(function()(
... 
))() 

그러나 이것은 내가 원하는 것이 아닙니다. 내가 원한 것은 getBrowser() 메소드가 값을 한 번만 계산하고 항상 사용하는 것이다. 객체 내부에 값을 저장하고 싶지 않다. 객체가 생성 될 때 즉시이 메소드를 실행하고 싶지 않다. 오직이 방법 만 사용하도록 허용되어이 모든 방법이이 방법에서 이루어져야합니다. 여기에 예제가 있습니다. "0"이 출력되지만 원하는 것은 각 console.log 요청에 대해 0,1,2,3이 출력된다는 것입니다. 나는 나 자신을 분명히하기를 희망한다. 감사.

(
function(window){ 

    if(window.BRB) return; 

    var BRB = function(){} 
    BRB.prototype.getBrowser = function(){ 
     var browser = null; 
     return function(){ 
      if(browser === null){ 
       browser = 0; 
      } 
      return browser++; 
     } 
    } 

    window.BRB = new BRB(); 
})(window); 

console.log(BRB.getBrowser()()); 
console.log(BRB.getBrowser()()); 
console.log(BRB.getBrowser()()); 
console.log(BRB.getBrowser()()); 
+0

: 그것은 getBrowser 기능 자체에 속성을 작성하여 작동? – bfavaretto

답변

1

귀하의 요구 사항은 좀 이상하다. 이게 니가 찾고있는거야? 난 당신이 getBrowser에 정적 속성을 생성 여부와 괜찮아, 내가 이해 확실하지 않다

(function(window){ 

    if(window.BRB) return; 

    var BRB = function(){} 
    BRB.prototype.getBrowser = function(){ 
     if(typeof this.getBrowser.browser == "undefined"){ 
      return this.getBrowser.browser = 0; 
     } else { 
      return ++this.getBrowser.browser; 
     } 
    } 

    window.BRB = new BRB(); 
})(window); 

console.log(BRB.getBrowser()); 
console.log(BRB.getBrowser()); 
console.log(BRB.getBrowser()); 
console.log(BRB.getBrowser()); 

http://jsfiddle.net/5DheZ/

+0

이것은 프로토 타입에 또 다른 객체 속성을 만듭니다.이 속성은 필요하지 않지만 기본적으로 이전 주석과 비슷하지만 실제로는 좋은 속성입니다. – ufucuk

+0

프로토 타입에 다른 속성을 만들지 않고 BRB.prototype.getBrowser에 속성을 만듭니다. – bfavaretto

+0

나는이 대답에 대해 다시 생각할 때 그것이 내 필요에 맞다고 생각한다. 고마워요! – ufucuk

1

당신은 다른 장소에 브라우저 변수를 정의해야합니다

:

(
function(window){ 

    if(window.BRB) return; 

    var browser = null; 
    var BRB = function(){} 
    BRB.prototype.getBrowser = function(){ 
     if(browser === null){ 
      browser = 0; 
     } 
     return browser++; 
    } 

    window.BRB = new BRB(); 
})(window); 

console.log(BRB.getBrowser()); 
console.log(BRB.getBrowser()); 
console.log(BRB.getBrowser()); 
console.log(BRB.getBrowser()); 

jsfiddle http://jsfiddle.net/5ByYR/1/

을 그리고 당신은 getBrowser 대신 함수의 객체를 할당 할 수있는 경우

(
function(window){ 

    if(window.BRB) return; 

    var BRB = function(){} 
    BRB.prototype.getBrowser = { 
     browser: null, 
     get: function() { 
      if(this.browser === null){ 
       this.browser = 0; 
      } 
      return this.browser++; 
     } 
    } 

    window.BRB = new BRB(); 
})(window); 

console.log(BRB.getBrowser.get()); 
console.log(BRB.getBrowser.get()); 
console.log(BRB.getBrowser.get()); 
console.log(BRB.getBrowser.get()); 
+0

또한 getBrowser가 새로운 함수를 매번 반환 할 좋은 이유가 없습니다 ... – bfavaretto

+0

내가 언급 한 바와 같이 이것은 허용되지 않습니다. 디커플링을 방지하기 때문에이 방법을 사용할 수 없습니다. 이 메서드를 다른 곳에서 사용하려면 객체 속성을 다른 객체 내부로 옮겨야합니다. 우리가 편집 할 수있는 곳은 getBrowser 메소드뿐입니다. – ufucuk

+0

분명히 함수를 반환 할 필요는 없습니다. 이것은 단지 더미 코드입니다. 여러 가지 방법으로이 코드를 구현할 수 있다고 언급했기 때문에 실험을 진행하면서 코드를 복사하여 붙여 넣었습니다. – ufucuk

1

당신은 obably getBrowser 메소드 결과에 대한 인생 폐쇄 할 목적 :

BRB.prototype.getBrowser = (function(){ 
    var browser = null; 
    return function(){ 
     if(browser === null){ 
      browser = 0; 
     } 
     return browser++; 
    } 
})(); 

browser 변수가 각 기능 호출 초기화되지이 방법.

브라우저 값에 대한 폐쇄의 범위 변수 대신 속성을 사용할 수
UPDATE :

BRB.prototype.getBrowser = function() { 
    if(!this.browser){ 
     this.browser = 0; 
    } 
    return this.browser++; 
} 
+0

이것은 객체가 생성 될 때 직접 실행되며 질문에서 언급했듯이 이것을 수행하지 않습니다. 만약 내가 100 가지 방법을 가지고 있다면 그들은 객체가 생성 될 때 모두 처형 될 것입니다. 그러나 처음부터 실행될 필요는 없습니다. – ufucuk

관련 문제