2012-04-24 4 views
0

아래 코드에서와 같이 클로저를 생성하는 반환 된 함수를 호출해도 괜찮습니까?닫기 자바 스크립트 호출

그래서 html에 액세스 할 때 Bay.HTML()();을 수행 할 필요가 없습니다. ?

Bay.prototype.HTML = function() { 
    var html; 
    return function() { 
     if (!html) { 
      var td = docCreate('td'); 
      td.setAttribute('id', 'bay' + this.number); 
      td.setAttribute('class', 'bay'); 
      html = td; 
     } 
     return html; 
    }(); <----------HERE 
}; 
+0

"괜찮습니까?" – Zirak

+1

이것은 "OK"로 보이지만, 제 생각에는 복잡합니다. 단순히 Bay 인스턴스에 html을 첨부하고 (whith this.html) 내부 클로저와 많은 코드를 삭제하지 않는 것이 어떻습니까? –

답변

2

-하지 : 당신이 원하는 것은 정말 폐쇄를 만듭니다.

+0

내가 게시 한 후, html 변수를 한 번 할당하는 방법을 찾았고 이후에 모든 호출에서 html 변수에서 데이터를 가져 와서 함수가 실행되지 않도록했습니다. 정말로, 내가 한 것은 this._html 속성을 수행하지 않고 프로토 타입을 유지하는 것입니다 .HTML 함수는 조금 과장된 것처럼 보였습니다. –

1

괜찮아요 그러나 당신의 HTML 캐시되지 않은 것 의미

Bay.prototype.HTML = function() { 
    var html; 

    if (!html) { 
     var td = docCreate('td'); 
     td.setAttribute('id', 'bay' + this.number); 
     td.setAttribute('class', 'bay'); 
     html = td; 
    } 
    return html; 
}; 

어떤 다른 아니다.

당신이 html를 캐시하려면

은 당신이 원하는 :

Bay.prototype.HTML = function() { 

    if (!this.html) { 
     var td = docCreate('td'); 
     td.setAttribute('id', 'bay' + this.number); 
     td.setAttribute('class', 'bay'); 
     this.html = td; 
    } 
    return this.html; 
}; 
1

그것은 당신이 뭔가 "확인"으로하려는 상황에 따라 달라집니다. 작동합니까? 그렇다면 때로는 그게 전부입니다. 다른 사람이 코드를 읽는 것이 명확한가요, 유지 보수가 가능한가, 안전합니까?

그래서 코드. 작동합니까? No

이 프로토 타입 함수가 호출 될 때마다 메소드 변수 'html'이 null로 초기화되므로 내부 함수의 조건은 항상 true로 평가되고 dom 요소를 설정하는 단계를 거칩니다.

여기에 폐쇄 장치를 사용해야합니까? 번호 :

호출 컨텍스트를 넘어서 지속되지 않으므로 쓸모가없는 클로저를 만듭니다. Bar.HTML()을 호출 할 때마다 나중에 수행 할 클로저 자체에 대한 참조를 저장하거나 반환하지 않으므로 일부 코드를 실행하기 위해 추가 컨텍스트를 만들고 파괴하게됩니다. 당신은 그냥 폐쇄를 고려하고, 실적이 더 좋은 결과를 얻을 수 : 물론

Bay.prototype.HTML = function() { 
    var html; 
    if(!html) { 
     var td = docCreate('td'); 
     td.setAttribute('id', 'bay' + this.number); 
     td.setAttribute('class', 'bay'); 
     html = td; 
    } 
    return html; 
} 

, 그 HTML을 VAR로를 문이 필요하지 않은 경우, 바로 거기 선언되고,하지만 난이 단지 몇 가지 예제 코드를 가정 .

여기에 closures in javascript에 대한 유용한 정보와 사용 방법 및 사용 방법이 나와 있습니다.

0

@Esailija가 맞습니다. 구현은 원하는대로 결과를 캐싱하지 않습니다.

그의 솔루션은 캐시하지만 공개 속성이됩니다. 캐시를 공개하지 않는 캐싱 버전을 원하면 잘못된 기능을 평가하는 것입니다. 난 당신이

Bay.prototype.HTML = (function() { 
    var html; 
    return function() { 
     if (!html) { 
      var td = docCreate('td'); 
      td.setAttribute('id', 'bay' + this.number); 
      td.setAttribute('class', 'bay'); 
      html = td; 
     } 
     return html; 
    }; 
})(); <----------HERE 

이 대신 즉시 Bay.prototype.HTML가 호출 될 때마다 쓸모없는 기능을 실행에, Bay.prototype.HTML에 폐쇄에서 반환 된 기능을 할당을 원하는 것 같아요

Bay.prototype.HTML = (function() { 
    var html; 
    return function() { 
     if(!html) { 
      var td = docCreate('td'); 
      td.setAttribute('id', 'bay' + this.number); 
      td.setAttribute('class', 'bay'); 
      html = td; 
     } 
     return html; 
    }; 
})(); 
+0

대단히 감사합니다! 이게 정확히 내가 찾고 있었던거야. 설명/검증과 함께 .. 그럼, 현금 지급 버전은 폐쇄와 비슷합니까? –

+0

*는 * 폐점입니다. 외부에서 평가 된 익명 함수는 내부 함수를 제외한 모든 것에 * 닫힌 * 반환 된 내부 함수의 범위를 만듭니다. 이전에 수행 된 작업은 함수 호출이 끝날 때 외부 범위가 "사망"했기 때문에 실제로 닫히지 않았습니다. –

+0

방금 ​​알아챈 또 다른 점은 Bay의 .HTML 속성이 var로 작동했다는 것입니다. 마치 클로저를 만들어 var html에 채우는 것처럼 생각했습니다. 하지만 실제로는 항상 .HTML()이 덮어 쓰기라고 불렀습니다. 여러 인스턴스를 가질 수있는 함수에서 현금화 된 값을 가질 수 있는지 확실하지 않습니다. –