2013-05-08 2 views
4

저는 JS에서 클로저에 대해 배우기 시작했습니다. 누군가 클로저가 실제로 클로저 였음을 깨닫지 못하고 클로저를 작성했다고 말했습니다. 나는 이것이 단지 싱글 톤 객체/클래스라고 생각했지만, 이것이 클로저라고 생각한다 :이 항목이 Javascript 클로저로 사용할 수 있습니까?

var myWidget = { 
    counter : 0, 
    init : function() { 
     myWidget.left(); 
     myWidget.right(); 
    }, 
    left : function() { 
     // whatever 
    }, 
    right : function() { 
     // whatever 
    } 
} 
myWidget.init(); 

클로저인가? 그렇지 않다면 무엇입니까?

+0

글쎄, 나는 그것이 주변 환경의 상태를 캡처 할 것임을 주목로 기술적으로 JS의 모든 기능이 폐쇄 생각 : 여기, 우리는 이후에있는 변수를 찾기위한 소스는이보기를 지원하는 다른 기사입니다. 나는 틀릴지도 모른다. – Dogbert

+0

이 [link] (http://stackoverflow.com/q/111102/1577396)는 클로저를 명확하게 이해하는 데 도움이 될 수 있습니다. –

+0

이것은 클래스도 클로저도 아닙니다. 잘못된 대답을 선택했습니다. –

답변

3

그래를 포함하는 생성, 그렇습니다. 이 코드 샘플에서

당신은 다음과 같습니다

  1. 방금 ​​정의 된 객체를 참조하는 속성 중 하나 (함수) 안에 폐쇄를 사용하여 일부 속성
  2. 와 일반 객체를 정의.
난 당신이 다른 함수를 전역 또는 내부 var myWidget을 정의하고 있는지, 당신은 여전히 ​​ myWidget에 대한 참조를 얻을 수있는 범위 체인을 통과 할 것이라는 점을 볼 수 있습니다

.

우리가 사용하는 경우이 definition of closures here :

A closure is a combination of a code block and data of 
a context in which this code block is created. 

또는 mozilla definition :

Closures are functions that refer to independent (free) variables. In other words, 
the function defined in the closure 'remembers' the environment in which it was created. 

당신이 myWidget.left()에 호출에 myWidget을 참조 클로저를 사용하는 myWidget.init() 내부의 코드 블록을 실행하고 myWidget.right()myWidget 변수를 컨텍스트/환경에 가지고 다니면 (init() 기능).

  1. myWidget 현재 function() 내부의 지역 변수이다 : 즉

    , 때 다음과 같은 상황이 발생 myWidget.init()을 실행? 부모 범위 (예 : GLOBAL)

  2. 현재 (즉, GLOBAL) 범위에서 변수 myWidget가 최대 은 NO
  3. 이동? 예 -> 폐고 사용
  4. myWidget 참조를 사용하면 변수를 검색 할 수 있습니다.

는 내가 이제까지 전역 범위에서 폐쇄 생각하지 않았다하지만 범위 체인은 모든 방법을 여행 유지 완벽한 의미가 단지 모든 것을 감싸는 최강의 또 다른 function() {} 코드 블록 역할을 GLOBAL, 최대

http://lostechies.com/derickbailey/2011/11/30/is-javascripts-global-scope-really-just-a-closure/

+0

흥미로운 Steven, 나는'myWidget.right() '가 이전에 정의 된 myWidget (조금 독특한 IMO)에 대한 클로저를 만들 것이라고 생각하지 않았지만 그럼에도 불구하고 클로저를 만들었습니다! – quickshiftin

+0

클로저는'myWidget.init()'내에 생성되며, 이전에 정의 된 변수'myWidget'를 포함하는 코드 블록입니다. myWidget.left()는 우리가 참조하고있는 데이터의 일부일뿐입니다. 클로저는 빚과 조금 비슷합니다. 중앙 은행까지 사슬을 계속 빌릴 수 있습니다. –

+0

정확히 "폐쇄"부분은 무엇입니까? 내가 올바르게 이해한다면, "myWidget"은 클로저 자체가 아니지만 "myWidget.init()"를 실행하는 것이 클로저입니까? – drumwolf

2

마치 폐쇄적 인 것처럼 보입니다. 여기에 더 좋은 예가 있습니다.

function init() { 
    var counter = 0; 

    return { 
     inc: function() { 
      counter++; 
     }, 
     show: function() { 
      return counter; 
     } 
    } 
} 

여기의 변수는 counter입니다. 당신이

var thing = init(); 

자바 스크립트가 정상적으로 init 함수에 지역 변수 왔으며, 따라서 그것의 실행 후 파괴 될지에 대한 참조를 유지하기가 말할 때 이유입니다. 이 설정을 사용하면 해당 지역 변수를 조작 할 수있는 함수가 반환됩니다.

당신은 일을 볼 수

thing.inc(); 
alert(thing.show()); 
thing.inc(); 
alert(thing.show()); 

를 호출 시도하고 다음 경고 2,하지만 기억, 그건 당신이 조작하고 init하는 지역 변수입니다! 그게 끝이야.

편집

조금 주위를 읽어 데, 그것은 문제의 코드는 폐쇄가 않습니다 분명하다. 주제에서 가장 즐긴 스레드는 here입니다. 그것이 밝혀 졌을 때, 제가 한 대답은 클로저의 한 특정 예일 뿐이지 만 결코 유일한 예는 아닙니다.

+0

이것은 C# 및 Java와 같은 고전적인 OO 언어에서'private' 속성을 모방하기 위해 클로저를 사용하는 좋은 예입니다. 그러나 문제의 코드는 클로저로도 적합합니다. –

+0

@StevendeSalas 그래, 어젯밤을 읽은 후 완전히 깨달았다. – quickshiftin

-3
For implementing javascript closure you have to get plugin that will take care of all closure properties like css closure and javascript closure. 

and you have to implement closure like the following example 

<g:compress> 
    <link rel="stylesheet" type="text/css" href="css/dp.css"/> 
    <link rel="stylesheet" type="text/css" href="css/demo.css"/>  
</g:compress> 
... 
<div id="datepicker"></div> 
<g:compress> 
    <script type="text/javascript" src="common.js"/> 
    <script type="text/javascript" src="closure/goog/base.js"/> 
    <script> 
     goog.require('goog.dom'); 
     goog.require('goog.date'); 
     goog.require('goog.ui.DatePicker'); 
    </script> 
    <script type="text/javascript"> 
     var dp = new goog.ui.DatePicker(); 
     dp.render(document.getElementById('datepicker')); 
    </script> 
</g:compress> 
+3

구글 폐쇄와 폐쇄의 프로그래밍 개념을 혼동스러워합니다. – JJJ

0

이 경우 폐쇄가 생성되지 않습니다. 즉각적인 어휘 범위의 외부에서이 How do JavaScript closures work?

액세스하는 변수를 참조하는 것은 myWidget가 액세스 할 때 너무 폐쇄가 초기화를 위해 생성되지 않습니다하는 폐쇄

myWidget가 글로벌 범위에서 정의된다 만듭니다.

함수 내에서 myWidget을 정의하고 init에서 외부 함수의 범위에있는 변수에 액세스하면 클로저가 생성됩니다.

var myWidget = (function() { 
    var number = 1; 

    return { 
    counter : 0, 
    init : function() { 
     myWidget.left(); 
     myWidget.right(); 
     number++; 
    }, 
    left : function() { 
     // whatever 
    }, 
    right : function() { 
     // whatever 
    } 
    } 
})(); 

myWidget.init(); 

위의 코드를 초기화를 호출

이 폐쇄가 변수 수를

관련 문제