C #의 람다 식도 닫혀 있지만 C # 커뮤니티 나 서적에서는 거의 논의되지 않습니다. C # 세계에서보다 훨씬 많은 JavaScript 사용자와 책이 클로저 에 대해 이야기하고 있습니다. 왜 그런 겁니까?
C #의 람다 식도 닫혀 있지만 C # 커뮤니티 나 서적에서는 거의 논의되지 않습니다. C # 세계에서보다 훨씬 많은 JavaScript 사용자와 책이 클로저 에 대해 이야기하고 있습니다. 왜 그런 겁니까?
답변:
자바 스크립트에는 네임 스페이스와 같은 기능이 없으므로 모든 종류의 전역 객체를 쉽게 엉망으로 만들 수 있습니다.
따라서 자체 실행 환경에서 일부 코드를 분리 할 수 있어야합니다. 클로저는 완벽합니다.
이 클로저 사용법은 네임 스페이스, 클래스 등이 코드를 분리하고 모든 것을 글로벌 범위에 두지 않는 C #과 같은 언어에서는 의미가 없습니다.
자바 스크립트 코드에 대한 일반적인 관행은 다음과 같이 작성하는 것입니다.
(function(){
// Some code
})();
보시다시피, 이것은 익명 함수 선언이며 즉시 실행됩니다. 따라서 함수 내에 정의 된 모든 것은 외부에서 액세스 할 수 없으며 전역 범위를 망칠 수 없습니다. 이 함수 내에서 정의 된 중첩 함수와 같이 일부 코드에서이를 사용하는 한이 함수의 실행 컨텍스트는 콜백 또는 기타로 전달할 수 있습니다.
자바 스크립트는 C #과 매우 다른 언어입니다. 객체 지향이 아니라 프로토 타입 지향입니다. 이것은 결국 매우 다른 관행으로 이어집니다.
어쨌든 클로저는 좋으므로 C #에서도 사용하십시오!
편집 : stackoverflow의 채팅에 대해 토론 한 후에이 anwer가 정밀해야한다고 생각합니다.
샘플 코드의 함수는 클로저가 아닙니다. 그러나이 기능은 로컬 변수 및 중첩 함수를 정의 할 수 있습니다. 이러한 지역 변수를 사용하는 모든 중첩 함수는 클로저입니다.
이것은 전역 범위를 망칠 필요없이 일련의 함수에서 일부 데이터를 공유하는 데 유용합니다. 이것은 자바 스크립트에서 가장 일반적으로 사용되는 클로저입니다.
클로저는 이와 같은 일부 데이터를 공유하는 것보다 훨씬 강력하지만 현실적으로 말하면 대부분의 프로그래머는 함수형 프로그래밍에 대해 알지 못합니다. C #에서는 이러한 종류의 용도로 클래스 또는 네임 스페이스를 사용했지만 JS는이 기능을 제공하지 않습니다.
전역 범위를 보호하는 것보다 클로저로 더 많은 것을 할 수 있지만 이것이 JS 소스 코드에서 볼 수 있습니다.
JavaScript의 객체 지향에 대한 일반적인 구현은 클로저에 의존하기 때문일 수 있습니다. 간단한 예를 보자.
function counter() {
var value = 0;
this.getValue = function() { return value; }
this.increase = function() { value++; }
}
var myCounter = new counter();
console.log(myCounter.getValue());
myCounter.increase();
console.log(myCounter.getValue());
메소드 getValue
와 increase
변수는 실제로 캡슐화되어 있습니다 value
.
JavaScript를 '가능하게 만드는'많은 라이브러리가이를 사용하기 때문입니다.
JQuery , Prototype 또는 MooTools를 살펴보면 세 가지 인기있는 이름을 지정할 수 있습니다. 각 라이브러리는 each
반복자 함수를 사용하는 선호하는 반복 방법으로 콜렉션에 대한 메소드를 제공 합니다. 이 함수는 외부 범위의 값에 액세스 할 때 클로저가됩니다.
[1,2,3].each(function(item) {
console.log(item);
});
Ajax의 콜백, Ext.js의 이벤트 처리 등은 모두 함수를 사용하며, 정확히 한 번만 호출되는 100ed 함수로 코드를 부풀리고 싶지 않다면 클로저를 사용하는 것이 좋습니다.
console.log
외부 범위에서 정의되므로 console
'자유 변수'입니다. 그리고 실제로 왜 효과가없는 for-loop가 나쁜 습관입니까?
JavaScript를 사용한 "좋은"코딩은 클로저에 더 크게 의존한다는 다른 답변에 동의합니다. 그러나 그 외에도 기능이 각 언어에서 얼마나 오랫동안 사용되었는지에 대한 질문 일 것입니다. JavaScript는 초기 구현 이후 기본적으로 폐쇄되었습니다. 반면 C #은 Visual Studio 2008과 함께 출시 된 3.0 이후로만 사용되었습니다.
내가 만나는 많은 C # 프로그래머는 여전히 2.0 프로젝트를 진행하고 있습니다. 3.0 또는 4.0에서 작업하더라도 2.0 관용구를 사용하는 경우가 많습니다. 나는 폐쇄를 좋아한다. 컨셉이 C # 개발자들 사이에서 전파됨에 따라 C #에서 더 많이 사용되기를 바랍니다.
주된 이유는 C #이 정적으로 유형이 지정되고 함수가 미리 결정된 단일 환경에만 액세스 할 수 있기 때문에 클로저의 유용성을 방해합니다.
반면 JavaScript에서는 클로저를 사용하면 객체 속성으로 액세스하고 일류 객체로 액세스 할 때 함수가 메소드로 작동 할 수 있으며 서브 루틴이 다른 컨텍스트에서 작동 할 수 있도록 다른 환경에 삽입 될 수도 있습니다.
내가 알아야 할 한 가지 이유는 DOM 요소 (또는 실제로 무엇이든)를 반복 할 때 변수 범위를 "닫거나"캡슐화 할 수 있기를 원했기 때문입니다. 여기에 게시 된 예와 같이 https : //.com/questions/5606059/how-to-create-closure-in-loop-and-store-it-in-variable-for-later-execution