가끔 “마감”이 언급되는 것을보고 찾아 보았지만 Wiki는 내가 이해할 수있는 설명을 제공하지 않습니다. 도와주세요.
댓글
- Java / C #을 아는 경우이 링크가 도움이되기를 바랍니다. http://www.developerfusion.com/article/8251/the-beauty-of-closures/
- 폐쇄는 이해하기 어렵습니다. 해당 Wikipedia 기사의 첫 문장에있는 모든 링크를 클릭하고 이해해야합니다. 기사 먼저.
- stackoverflow.com/questions/36636/what-is-a-closure
- 무엇 ‘가 클로저와 클래스의 근본적인 차이점은 무엇입니까? 좋아요, 하나의 공개 메서드 만있는 클래스입니다.
- @biziclop : 그럴 수 있습니다 . i> 클래스로 클로저를 에뮬레이트합니다 (‘ Java 개발자가 수행해야하는 작업 임). 그러나 ‘ 일반적으로 약간 덜 장황합니다. 만들고 당신은 당신이 다루는 일을 ‘ 수동으로 관리 할 필요가 없습니다. (하드 코어리스 퍼도 비슷한 질문을하지만 다른 결론에 도달 할 수 있습니다. 언어 수준의 OO 지원은 폐쇄 할 때 불필요합니다.)
답변
(면책 조항 : 이것은 기본적인 설명입니다. 정의가 진행되는 한 저는 약간 단순화하겠습니다.)
클로저를 생각하는 가장 간단한 방법은 변수로 저장 될 수있는 함수 ( “첫 번째 -class function “), 생성 된 범위에 로컬 인 다른 변수에 액세스 할 수있는 특수 기능이 있습니다.
예 (JavaScript) :
var setKeyPress = function(callback) { document.onkeypress = callback; }; var initialize = function() { var black = false; document.onclick = function() { black = !black; document.body.style.backgroundColor = black ? "#000000" : "transparent"; } var displayValOfBlack = function() { alert(black); } setKeyPress(displayValOfBlack); }; initialize();
document.onclick
및 iv id에 할당 된 기능 1 = “3fee5ad5ad”>
는 클로저입니다. 둘 다 부울 변수black
를 참조하지만 해당 변수는 함수 외부에 할당되어 있습니다.black
는 함수가 정의 된 범위의 로컬 이면이 변수에 대한 포인터가 유지됩니다.
이를 HTML 페이지에 넣는 경우 :
- 검은 색으로 변경하려면 클릭
- “true”를 보려면 [enter]를 누르세요.
- 다시 클릭하면 흰색으로 다시 변경됩니다.
- false를 보려면 [enter]를 누르세요.
둘 다 동일한 black
에 액세스 할 수 있음을 보여줍니다. 래퍼 개체 없이 상태를 저장하는 데 사용할 수 있습니다.
setKeyPress
에 대한 호출은 함수를 전달하는 방법을 보여줍니다. 다른 변수처럼. 클로저에 보존 된 범위 는 여전히 함수가 정의 된 곳입니다.
클로저는 일반적으로 특히 JavaScript 및 ActionScript에서 이벤트 핸들러로 사용됩니다. 클로저를 잘 사용하면 객체 래퍼를 만들지 않고도 변수를 이벤트 핸들러에 암시 적으로 바인딩하는 데 도움이됩니다. 그러나 부주의하게 사용하면 메모리 누수가 발생할 수 있습니다 (예 : 사용되지 않지만 보존 된 이벤트 처리기가 메모리의 큰 개체, 특히 DOM 개체를 유지하여 가비지 수집을 방지하는 유일한 경우).
1 : 사실 JavaScript의 모든 기능은 클로저입니다.
댓글
- 당신의 답변을 읽으면서 저는 내 마음 속에서 전구가 켜지는 것을 느꼈다. 매우 감사! 🙂
-
black
가 함수 내에서 선언되었으므로 스택이 풀릴 때 ‘ 파괴되지 않습니다. ..? - @gablin, 이것이 클로저가있는 언어의 고유 한 점입니다. 가비지 컬렉션을 사용하는 모든 언어는 거의 동일한 방식으로 작동합니다. 객체에 대한 참조가 더 이상 유지되지 않으면 폐기 될 수 있습니다. JS에서 함수가 생성 될 때마다 해당 함수가 소멸 될 때까지 로컬 범위가 해당 함수에 바인딩됩니다.
- @gablin, ‘ 좋은 질문입니다. 나는 ‘ 그들이 할 수 없다고 ‘ & 생각하지 않습니다. mdash; 하지만 JS가 사용하는 것이므로 ‘가 “라고 말했을 때 참조하는 것처럼 보이기 때문에 가비지 수집 만 가져 왔습니다.
black
는 함수 내에서 선언되며 ‘ 파괴되지 않습니다 “. 또한 함수에서 객체를 선언 한 다음 다른 위치에있는 변수에 할당하면 다른 참조가 있기 때문에 해당 객체는 보존됩니다. - Objective-C (및 C clang)은 가비지 수집없이 기본적으로 클로저 인 블록을 지원합니다. 런타임 지원과 메모리 관리에 대한 수동 개입이 필요합니다.
답변
클로저는 기본적으로 객체를 보는 다른 방식입니다. 객체는 하나 이상의 함수가 바인딩 된 데이터입니다. 클로저는 하나 이상의 변수가 바인딩 된 함수입니다. 둘은 최소한 구현 수준에서 기본적으로 동일합니다. 진짜 차이점은 그것들이 어디에서 왔는지에 있습니다.
객체 지향 프로그래밍에서는 먼저 멤버 변수와 메서드 (멤버 함수)를 정의하여 객체 클래스를 선언 한 다음 그 수업. 각 인스턴스는 생성자에 의해 초기화 된 멤버 데이터의 복사본과 함께 제공됩니다. 그런 다음 객체 유형의 변수를 갖고 데이터의 특성에 초점을 맞추기 때문에 데이터로 전달합니다.
반면에 객체는 그렇지 않습니다. 객체 클래스처럼 미리 정의되거나 코드의 생성자 호출을 통해 인스턴스화됩니다. 대신 다른 함수 내부의 함수로 클로저를 작성합니다. 클로저는 외부 함수의 로컬 변수를 참조 할 수 있으며 컴파일러는이를 감지하고 이러한 변수를 외부 함수의 스택 공간에서 클로저의 숨겨진 객체 선언으로 이동합니다. 그런 다음 클로저 유형의 변수를 갖게됩니다. , 기본적으로 내부적으로는 객체지만 함수로서의 본질에 초점이 맞춰져 있으므로 함수 참조로 전달합니다.
댓글
- +1 : 좋은 답변입니다. 클로저는 하나의 메서드 만있는 객체로, 임의의 객체는 일부 공통 기본 데이터 (객체 ‘의 멤버 변수)에 대한 클로저 모음으로 볼 수 있습니다. 이 두 관점은 상당히 대칭 적이라고 생각합니다.
- 아주 좋은 대답입니다. 실제로 폐쇄에 대한 통찰력을 설명합니다.
- @Mason Wheeler : 폐쇄 데이터는 어디에 저장됩니까? 함수처럼 스택? 아니면 객체와 같은 힙에서?
- @RoboAlex : 힙에서, ‘는 함수와 유사한 객체이기 때문입니다. .
- @RoboAlex : 클로저 및 캡처 된 데이터가 저장되는 위치는 구현에 따라 다릅니다. C ++에서는 힙이나 스택에 저장할 수 있습니다.
Answer
클로저 는 코드 (블록, 함수)가 코드 블록이 정의 된 환경에 의해 (즉, 값에 바인딩 됨).
예를 들어 Scala 함수 정의를 사용합니다. :
def addConstant(v: Int): Int = v + k
함수 본문에는 두 개의 이름 (변수) v
및 는 두 개의 정수 값을 나타냅니다. v
라는 이름은 addConstant
함수의 인수로 선언 되었기 때문에 바인딩됩니다 (함수 선언을 보면 v
에 값이 할당됩니다. k
라는 이름은 addConstant
함수에 대해 무료입니다. 함수에 어떤 값이 있는지에 대한 단서가 없기 때문입니다. k
는 (및 방법)에 바인딩됩니다.
다음과 같은 호출을 평가하려면
val n = addConstant(10)
k
값. k
이름이 addConstant
가 정의됩니다. 예 :
def increaseAll(values: List[Int]): List[Int] = { val k = 2 def addConstant(v: Int): Int = v + k values.map(addConstant) }
이제 iv id = “2e5c2029cc”가있는 컨텍스트에서 addConstant
를 정의했습니다. >
가 정의되고addConstant
는 폐쇄 가되었습니다. 무료 변수는 이제 닫힘 (값에 바인딩 됨) :addConstant
함수 인 것처럼 호출되고 전달됩니다. 무료 변수k
는 클로저가 정의 된 , 인수 변수v
는 클로저가 호출 될 때 바인딩됩니다.
따라서 클로저는 기본적으로 컨텍스트에 의해 바인딩 된 후 자유 변수를 통해 비 로컬 값에 액세스 할 수있는 함수 또는 코드 블록입니다.
여러 언어에서 클로저는 익명 으로 만들 수있을 때만 사용합니다. 예 :
def increaseAll(values: List[Int]): List[Int] = { val k = 2 values.map(v => v + k) }
자유 변수가없는 함수는 (빈 변수 세트가있는) 클로저의 특별한 경우입니다. 유사하게 익명 함수 는 익명 폐쇄 , 즉 익명 함수는 자유 변수가없는 익명 클로저입니다.
코멘트
- 이는 논리에서 닫힌 수식과 열린 수식과 잘 어울립니다. 답변 해 주셔서 감사합니다.
- @RainDoctor : 자유 변수는 논리 수식과 람다 미적분 식에서 비슷한 방식으로 정의됩니다. 람다 식의 람다는 논리 수식 wrt 자유 / 바운드 변수의 수량 자처럼 작동합니다. .
답변
자바 스크립트의 간단한 설명 :
var closure_example = function() { var closure = 0; // after first iteration the value will not be erased from the memory // because it is bound with the returned alertValue function. return { alertValue : function() { closure++; alert(closure); } }; }; closure_example();
alert(closure)
는 이전에 생성 된 closure
값을 사용합니다. 반환 된 alertValue
함수의 네임 스페이스는 closure
변수가있는 네임 스페이스에 연결됩니다. 전체 함수를 삭제하면 closure
변수의 값은 삭제되지만 그때까지는 alertValue
함수가 항상 변수의 값을 읽고 쓸 수 있습니다. closure
.
이 코드를 실행하면 첫 번째 반복에서 closure
변수에 값 0을 할당하고 함수를 다음으로 다시 작성하십시오.
var closure_example = function(){ alertValue : function(){ closure++; alert(closure); } }
그리고 alertValue
에는 지역 변수가 필요하기 때문에 closure
함수를 실행하기 위해 이전에 할당 된 지역 변수 closure
의 값으로 자신을 바인딩합니다.
이제
함수의 경우 alert(closure)
가 다음과 같기 때문에 closure
변수의 증가 된 값을 기록합니다. bound.
closure_example.alertValue()//alerts value 1 closure_example.alertValue()//alerts value 2 closure_example.alertValue()//alerts value 3 //etc.
댓글
- 감사합니다. ‘ 코드를 테스트하지 마세요 =) 이제 모든 것이 괜찮은 것 같습니다.
답변
“클로저”는 , 본질적으로 일부 지역 주 및 일부 코드가 패키지로 결합됩니다. 일반적으로 로컬 상태는 주변 (어휘) 범위에서 비롯되며 코드는 (본질적으로) 내부 함수이며 외부로 반환됩니다. 그런 다음 클로저는 내부 함수가 보는 캡처 된 변수와 내부 함수의 코드의 조합입니다.
불행히도 설명하기가 약간 어려운 이유 중 하나입니다. 익숙하지 않습니다.
과거에 성공적으로 사용한 비유 중 하나는 “우리가”책 “이라고 부르는 것이 있다고 상상해보십시오. 방 폐쇄에”책 “이 저기 구석에있는 카피입니다. , 테이블 클로저에는 Dresden Files 책의 사본이 있습니다. 따라서 어떤 클로저에 있는가에 따라 “give me the book”코드는 다른 일이 발생합니다. “
댓글
- 잊었습니다. en.wikipedia.org/wiki/Closure_ (computer_programming) 귀하의 답변입니다.
- 아니요, 해당 페이지를 닫지 않기로 결정했습니다.
- ” 상태 및 기능. ” :
static
지역 변수가있는 C 함수를 클로저로 간주 할 수 있습니까? Haskell에서 상태를 포함합니까? - @Giorgio Haskell의 클로저는 그들이 정의 된 어휘 범위의 인수를 닫습니다. ‘ ‘ d는 ” 예 “라고 말합니다 (하스켈에 익숙하지 않지만). 정적 변수가있는 AC 함수는 기껏해야 매우 제한된 클로저입니다 (
static
로컬 변수를 사용하여 단일 함수에서 여러 클로저를 생성 할 수 있기를 원합니다. 정확히 하나). - 정적 변수가있는 C 함수는 클로저가 아니라고 생각하기 때문에이 질문을했습니다. 정적 변수는 로컬로 정의되고 클로저 내부에서만 알려져 있으며 액세스하지 않습니다. 환경. 또한 100 % 확신 할 수는 없지만 다른 방식으로 귀하의 진술을 공식화 할 것입니다. 폐쇄 메커니즘을 사용하여 다른 함수를 생성합니다 (함수는 폐쇄 정의 + 자유 변수에 대한 바인딩).
답변
“상태”의 개념을 정의하지 않고 클로저가 무엇인지 정의하는 것은 어렵습니다.
기본적으로 , 함수를 일급 값으로 취급하는 전체 어휘 범위가 지정된 언어에서 특별한 일이 발생합니다. 다음과 같은 작업을 수행해야하는 경우 :
function foo(x) return x end x = foo
변수 x
는 하지만 마지막으로 반환되었을 때 남은 상태 foo
도 참조합니다. 진정한 마술은 foo
가 범위 내에서 추가로 정의 된 다른 기능을 가질 때 발생합니다. “일반적으로”우리가 전역 환경에서 함수를 정의하는 것처럼) 자체 미니 환경과 같습니다.
기능적으로 C ++ (C?) “의”정적 “키워드 : 여러 함수 호출을 통해 지역 변수의 상태를 유지합니다. 그러나 이것은 함수에 동일한 원칙 (정적 변수)을 적용하는 것과 비슷합니다. 함수는 일급 값이기 때문입니다. 클로저는 저장 될 전체 함수의 상태에 대한 지원을 추가합니다 (C ++의 정적 함수와 관련이 없음).
함수를 일급 값으로 처리하고 클로저에 대한 지원을 추가하면 메모리에 동일한 함수의 인스턴스를 두 개 이상 가질 수 있습니다 (클래스와 유사). 이것은 다시 사용할 수 있다는 것을 의미합니다. 함수 내에서 C ++ 정적 변수를 처리 할 때 필요한 것과 같이 함수의 상태를 재설정하지 않고도 동일한 코드를 사용할 수 있습니다 (이에 대해 잘못되었을 수 있습니까?).
여기에 Lua의 클로저 지원 테스트가 있습니다. .
--Closure testing --By Trae Barlow -- function myclosure() print(pvalue)--nil local pvalue = pvalue or 10 return function() pvalue = pvalue + 10 --20, 31, 42, 53(53 never printed) print(pvalue) pvalue = pvalue + 1 --21, 32, 43(pvalue state saved through multiple calls) return pvalue end end x = myclosure() --x now references anonymous function inside myclosure() x()--nil, 20 x() --21, 31 x() --32, 42 --43, 53 -- if we iterated x() again
결과 :
nil 20 31 42
까다로울 수 있으며 다를 수 있습니다. 언어에서 언어로,하지만 Lua에서는 함수가 실행될 때마다 그 상태가 재설정되는 것처럼 보입니다. 함수 / 상태 직접 (익명 함수를 통해 반환하는 대신), pvalue
는 다시 10으로 재설정됩니다. 하지만 x (익명 함수)를 통해 myclosure의 상태에 액세스하면 pvalue
가 살아 있고 메모리 어딘가에 잘 있다는 것을 알 수 있습니다. 누군가는 구현의 본질을 더 잘 설명 할 수 있습니다.
PS : C ++ 11 (이전 버전에있는 것 외에는)을 잘 모르기 때문에 이것이 “비교”가 아닙니다. C ++ 11과 Lua의 클로저 사이. 또한 Lua에서 C ++ 로의 모든 “선 그리기”는 정적 변수와 클로저가 100 % 동일하지 않기 때문에 유사합니다. 유사한 문제를 해결하는 데 가끔 사용되는 경우에도 마찬가지입니다.
위 코드 예제에서 제가 확신 할 수없는 것은 익명 함수 또는 상위 함수가 클로저로 간주되는지 여부입니다.
p>
Answer
클로저는 관련 상태가있는 함수입니다.
perl에서 다음과 같은 클로저를 만듭니다.
#!/usr/bin/perl # This function creates a closure. sub getHelloPrint { # Bind state for the function we are returning. my ($first) = @_;a # The function returned will have access to the variable $first return sub { my ($second) = @_; print "$first $second\n"; }; } my $hw = getHelloPrint("Hello"); my $gw = getHelloPrint("Goodby"); &$hw("World"); // Print Hello World &$gw("World"); // PRint Goodby World
C ++에서 제공하는 새로운 기능을 살펴보면.
현재 상태를 객체에 바인딩 할 수도 있습니다.
#include <string> #include <iostream> #include <functional> std::function<void(std::string const&)> getLambda(std::string const& first) { // Here we bind `first` to the function // The second parameter will be passed when we call the function return [first](std::string const& second) -> void { std::cout << first << " " << second << "\n"; }; } int main(int argc, char* argv[]) { auto hw = getLambda("Hello"); auto gw = getLambda("GoodBye"); hw("World"); gw("World"); }
답변
간단한 함수를 생각해 보겠습니다.
function f1(x) { // ... something }
이 함수는 다른 함수 내에 중첩되지 않기 때문에 최상위 함수라고합니다. 모두 JavaScript 함수는 “Scope Chain “라는 개체 목록과 연결됩니다.이 범위 체인은 정렬 된 객체 목록 E 이러한 개체 각각은 몇 가지 변수를 정의합니다.
최상위 함수에서 범위 체인은 단일 개체 인 전역 개체로 구성됩니다. 예를 들어 위의 f1
함수에는 모든 전역 변수를 정의하는 단일 개체가있는 범위 체인이 있습니다. (여기서 “객체”라는 용어는 JavaScript 객체를 의미하는 것이 아니라 JavaScript가 변수를 “조회”할 수있는 변수 컨테이너 역할을하는 구현 정의 객체 일뿐입니다.)
함수가 호출되면 JavaScript는 “Activation object”라는 것을 생성하여 범위 체인의 맨 위에 배치합니다. object는 모든 지역 변수를 포함합니다 (예 : 여기서 x
). 따라서 이제 범위 체인에 두 개의 개체가 있습니다. 첫 번째는 활성화 개체이고 그 아래에는 전역 개체입니다.
두 객체는 서로 다른 시간에 스코프 체인에 배치된다는 점에 매우주의해야합니다. 전역 객체는 함수가 정의 될 때 (즉, JavaScript가 함수를 구문 분석하고 함수 객체를 생성 할 때) 배치되고 활성화 객체는 함수가 호출 될 때 들어갑니다.
그래서 이제 우리는 이것을 알고 있습니다 :
- 모든 함수는 그것과 관련된 범위 체인을 가지고 있습니다.
- 함수가 정의되면 (함수 객체가 생성 될 때) JavaScript는 해당 함수와 함께 범위 체인을 저장합니다.
- 최상위 수준 함수의 경우 범위 체인에는 함수 정의 시간에 전역 객체 만 포함되고 추가 호출시 활성화 객체가 맨 위에 표시됩니다.
중첩 된 함수를 다룰 때 상황이 흥미로워집니다. 이제 하나를 만들어 보겠습니다.
function f1(x) { function f2(y) { // ... something } }
f1
가 정의되면 여기에 포함 된 범위 체인을 얻습니다. 전역 개체 만.
이제 f1
가 호출되면 f1
의 범위 체인이 활성화 개체를 가져옵니다. 이 활성화 개체에는 x
변수와 함수 인 변수 f2
가 포함되어 있습니다. 그리고 f2
가 정의되고 있습니다.따라서이 시점에서 JavaScript는 f2
에 대한 새 범위 체인도 저장합니다. 이 내부 함수에 대해 저장된 범위 체인은 현재 유효한 범위 체인입니다. 현재 범위 사실상 체인은 f1
“의 체인입니다. 따라서 f2
“의 범위 체인은 f1
“의 현재 범위 체인-f1
의 활성화 개체를 포함합니다. 및 전역 개체입니다.
f2
가 호출되면 y
, f1
의 활성화 개체와 전역 개체가 이미 포함 된 범위 체인에 추가되었습니다.
f2
, 범위 체인은 정의 시점에 3 개의 개체 (2 개의 외부 함수의 2 개 활성화 개체 및 전역 개체)와 호출 시점에 4 개의 개체를 포함합니다.
그래서, 이제 우리는 언더 스코프 체인이 작동하는 방식을 확인했지만 아직 클로저에 대해서는 언급하지 않았습니다.
함수 개체와 범위 (변수 바인딩 집합)의 조합 함수의 변수가 해결되는 것을 컴퓨터 과학 문헌에서는 클로저라고합니다. JavaScript, David Flanagan의 최종 가이드
대부분의 함수는 함수가 정의되었을 때 적용되었던 동일한 범위 체인을 사용하여 호출되며, 관련된 클로저가 있다는 것은 실제로 중요하지 않습니다. 클로저는 정의되었을 때 적용되었던 것과 다른 범위 체인에서 호출 될 때 흥미로워집니다. 이는 중첩 된 함수 객체가 정의 된 함수에서 반환 된 일 때 가장 일반적으로 발생합니다.
함수가 반환되면 해당 활성화 개체가 범위 체인에서 제거됩니다. 중첩 된 함수가없는 경우 활성화 개체에 대한 참조가 더 이상 없으며 가비지 수집됩니다. 중첩 된 함수가 정의 된 경우 각 함수에는 범위 체인에 대한 참조가 있고 해당 범위 체인은 활성화 개체를 참조합니다.
하지만 중첩 된 함수 개체가 외부 함수 내에 남아 있으면 그런 다음 참조한 활성화 개체와 함께 가비지 수집됩니다. 그러나 함수가 중첩 된 함수를 정의하고 반환하거나 속성에 어딘가에 저장하면 중첩 된 함수에 대한 외부 참조가 있습니다. 가비지 수집되지 않으며 참조하는 활성화 개체도 가비지 수집되지 않습니다.
위의 예에서는 f2
를 반환하지 않습니다. div> from f1
, 따라서 f1
에 대한 호출이 반환되면 활성화 개체가 범위 체인에서 제거되고 가비지 수집됩니다. 하지만 다음과 같은 경우 :
function f1(x) { function f2(y) { // ... something } return f2; }
여기에서 반환되는 f2
에는 다음과 같은 범위 체인이 있습니다. f1
의 활성화 개체를 포함하므로 가비지 수집되지 않습니다. 이 시점에서 f2
를 호출하면 f1
“의 변수 x
비록 우리가 f1
밖에 있더라도.
따라서 우리는 함수가 범위 체인과 함께 범위 체인을 유지한다는 것을 알 수 있습니다. 외부 함수의 모든 활성화 객체가 있습니다. 이것이 클로저의 핵심입니다. JavaScript의 함수는 “어휘 범위”는 호출 될 때 활성화 된 범위와 반대로 정의 될 때 활성화 된 범위를 저장한다는 의미입니다.
개인 변수 근사화와 같은 클로저를 포함하는 강력한 프로그래밍 기술이 많이 있습니다. , 이벤트 기반 프로그래밍, 부분 애플리케이션 등
또한이 모든 사항은 클로저를 지원하는 모든 언어에 적용됩니다. 예를 들어 PHP (5.3 이상), Python, Ruby 등
답변
클로저는 컴파일러 최적화입니다 (일명 구문 설탕?). 어떤 사람들은 이것을 Poor Man s Object 라고도합니다.
Eric Lippert의 답변보기 : (아래 발췌)
컴파일러는 다음과 같은 코드를 생성합니다.
private class Locals { public int count; public void Anonymous() { this.count++; } } public Action Counter() { Locals locals = new Locals(); locals.count = 0; Action counter = new Action(locals.Anonymous); return counter; }
이치에 맞습니까?
또한 비교를 요청했습니다. VB와 JScript는 모두 거의 동일한 방식으로 클로저를 생성합니다.
댓글
- 이 답변은 CW입니다. ‘ Eric에게 점수를받을 자격이 없기 때문입니다. ‘의 훌륭한 대답입니다.당신이 적합하다고 생각되면 그것을 찬성하십시오. HTH
- -1 : 귀하의 설명은 C #에서 너무 루트입니다. 클로저는 여러 언어로 사용되며 이러한 언어의 구문 설탕 그 이상이며 기능과 상태를 모두 포함합니다.
- 아니요, 클로저는 단순한 ” 컴파일러 최적화 ” 또는 구문 설탕. -1