이 답변을 읽어보니 내용을 잘 이해하지 못한 것 같습니다.
저는 Java를 배우고 있습니다. 오늘 인터뷰에서 면접관님이 익명 클래스에 대해 언급하셨는데, Java 8에서는 Lamada 스타일이 제공되고, JS에도 클로저라는 개념이 있다고 하더군요. 면접관이 폐쇄가 무엇인지 물었습니다. 클로저를 사용하는 이유는 무엇입니까?
다음과 같이 말했습니다. 액세스를 제어하는 데 사용하세요. 내부는 외부에 접근할 수 있지만 외부는 내부에 접근할 수 없습니다.
면접관은 이 대답에 별로 만족하지 않는 것 같았습니다. 전문가들은 이 문제에 대해 어떻게 생각하는지 궁금합니다.
이 답변을 읽어보니 내용을 잘 이해하지 못한 것 같습니다.
저는 Java를 배우고 있습니다. 오늘 인터뷰에서 면접관님이 익명 클래스에 대해 언급하셨는데, Java 8에서는 Lamada 스타일이 제공되고, JS에도 클로저라는 개념이 있다고 하더군요. 면접관이 폐쇄가 무엇인지 물었습니다. 클로저를 사용하는 이유는 무엇입니까?
다음과 같이 말했습니다. 액세스를 제어하는 데 사용하세요. 내부는 외부에 접근할 수 있지만 외부는 내부에 접근할 수 없습니다.
면접관은 이 대답에 별로 만족하지 않는 것 같았습니다. 전문가들은 이 문제에 대해 어떻게 생각하는지 궁금합니다.
클로저는 이름 그대로 찐빵이 찐빵으로 변해요~
찐빵은 밀가루로만 만들어지고 속을 채우면 찐빵이 됩니다
바오즈는 속을 채워 만든 찐빵입니다
클로저는 자체 운영 환경에 따라오는 기능입니다
파게는 자기만의 배경음악이 있는 남자에요~
자체적인 운영 환경을 가져온다는 말의 의미를 이해하지 못하는 아이들도 있어요~
또 다른 예를 들어볼까요~
프로그래머들은 다들 라면을 먹어보셨나요?
일반 라면과 무엇이 다른가요?
조미료 팩을 직접 가져오시면 됩니다.
양념봉지는 라면을 조리하는 환경입니다.
국수 조리 과정을 단순화합니다. 이를 통해 사용자는 요리 기술을 익히지 않고도 맛있는 쇠고기 국수를 즐길 수 있습니다.
함수형 프로그래밍의 종결은 함수의 조미료 패키지입니다. 사용자가 함수를 호출할 수 있는
편의성. 복잡한 외부 상태 유지에 대해 걱정할 필요가 없습니다.
예를 들어 Python은 다양한 방식으로 클로저를 사용합니다.
정적 개인 변수~
부분 함수~
단일 매개변수화~
데코레이터~
……
이 기능을 사용하면 실제로는 남들이 설정한 양념 패키지로 '라면'을 먹는 셈입니다.
사실 제가 이해한 바는 클로저의 목적은 변수의 범위를 확장하는 것입니다.
함수 즉시 실행과 클로저의 관계는 무엇인가요
@biancheng의 이해에 집중하세요. 제 답변이 상대적으로 약합니다. 그래도 관심이 있으시면 Height Three의 스코프 체인 및 클로저에 대한 설명을 읽어보세요~
방금 읽은 기사: 역사상 가장 욕을 먹은 프로그래밍 언어 - JavaScript
작가님 답변이 정확하지도 않고 제가 면접관이었다면 만족스럽지 못했을 것 같아요.
간단히 말하면 클로저란 함수가 객체로 반환될 때 외부 변수가 연행되면 클로저가 형성되는 것을 의미합니다. 찐빵을 속재료로 만들어 찐빵이 되었다고 비유한 동급생의 대답은 대부분 농담이었지만 그의 이해는 매우 깊었습니다.
함수가 외부 변수를 패키징하면 프로그램에 많은 유연성을 제공할 수 있습니다. 클로저는 외부 세계와 동일한 함수이지만(호출 방법은 동일하게 유지됨) 왜냐하면 그 안의 변수가 다르면 많은 기능이 완성될 수 있기 때문입니다. 이건 동급생이 말한건데 자체적인 동작환경과 배경음악이 딸려오는 기능이라 생각하면 무섭네요.
더 자세히 알고 싶으시면 제가 요약한 글을 참조하시면 Python의 클로저에 대해 자세히 설명할 수 있습니다. 프로그래밍 언어는 다르지만 원리는 동일합니다.
귀하의 답변은 종결이 아니라 범위에 관한 것입니다. 그리고 이 답변 역시 부정확한 답변입니다. 무엇이 내부이고 무엇이 외부인지 전혀 설명할 수 없습니다.
클로저도 이런 것 같아요. 함수가 정의된 범위 외부에서 호출되면 해당 함수는 정의된 범위에 계속 액세스합니다. 이 현상을 폐쇄라고 합니다.
특정 용도가 많이 있으며, 일반적인 용도로는 개인 속성 생성, 함수 커링 등이 있습니다.
------------구분선------------
클로저의 본질은 정적 범위라는 점을 덧붙이고 싶습니다. JavaScript에는 동적 범위가 없기 때문에 함수가 정의될 때 범위에 액세스하므로 클로저를 구현할 수 있습니다.
다른 답변에서는 클로저가 자체 운영 환경과 함께 제공되는 기능이라고 말합니다. 그런데 사실 자바스크립트의 모든 함수는 자체적인 실행 환경을 가지고 있는 함수가 아닌가요? 어떤 사람들은 모든 함수가 클로저라고 믿습니다. 이것은 확실히 틀린 것은 아니지만 클로저를 이해하는 데는 실제로 큰 의미가 없습니다. 보통 이런 식으로 함수를 사용하기 때문에 클로저가 무엇인지 모르더라도 문제가 되지 않습니다. 단지 전역 범위가 큰 폐쇄라는 사실을 깨닫지 못할 수도 있습니다.
일반적인 클로저 형식은 함수 a가 함수 b를 덮고 함수 a가 함수 b를 반환하므로 함수 b가 함수 a가 아닌 다른 곳에서 실행될 때 여전히 함수 a의 범위에 액세스할 수 있다는 것입니다. 그 중 "함수 b가 함수 a가 아닌 다른 곳에서 실행될 때"에는 클로저의 실제 위력이 반영됩니다.
요컨대 클로저는 정적 범위를 기반으로 한 프로그래밍 기술일 뿐입니다. 인터뷰 관점에서 클로저가 무엇인지 대답하려면 먼저 정적 범위의 특징을 설명해야 하며, 그 다음 "함수 b가 함수 a가 아닌 다른 곳에서 실행될 때"는 클로저로 간주된다는 점을 강조해야 합니다. .Bao의 완전한 답변.
람다 미적분학은 단일 입력과 단일 출력만 허용하므로 lambda a, b: a + b
는 커링인 lambda a: lambda b: a + b
과 같습니다.
간단히 말해서 클로저의 정의는 함수가 정의된 범위에 액세스할 수 있다는 것입니다.
그래서 말씀하신 접근 제어는 클로저의 적용 시나리오일 뿐이죠. 물론 클로저가 무엇인지에 대한 질문에는 대답을 해주지 않았기 때문에 면접관은 당연히 불만을 품게 될 것입니다.
또한 Java는 실제로 클로저를 지원하지 않습니다. 익명 내부 클래스는 클로저와 유사해 보이지만 실제로는 기능이나 구현 측면에서 클로저로 간주될 수 없습니다. 이유:
기능적으로 익명 내부 클래스에서 액세스되는 변수는 final이어야 합니다(Java8은 암시적으로 final을 선언함)
구현상 익명 내부 클래스에서 접근하는 final 변수 값은 실제로 외부에서 복사되기 때문에 실제로는 이전 스코프에 접근할 수 없기 때문에 final이어야 한다.
소위 "클로저"는 많은 변수와 이러한 변수에 바인딩된 환경을 포함하는 표현식(보통 함수)을 의미하므로 이러한 변수도 표현식의 일부입니다.
Javascript에서 클로저 생성을 가장 잘 설명하는 방법은 다음과 같습니다.
<code>function a(){ var i=0; function b(){ alert(++i); } return b; } var c=a(); c();</code>
함수 b는 함수 a 내에 중첩되어 있습니다. 함수 a는 함수 b를 반환합니다.
이런 식으로 var c=a()를 실행한 후 변수 c는 실제로 함수 b를 가리킵니다. c()를 다시 실행하면 i 값을 표시하는 창이 팝업됩니다(처음은 1입니다). 이 코드는 실제로 클로저를 생성합니다. 함수 a 외부의 변수 c는 함수 a 내부의 함수 b를 참조하기 때문입니다. 즉, 함수 a의 내부 함수 b가 함수 a 외부의 변수에 의해 참조되면 A 클로저가 생성됩니다. .
사실 일반적인 클로저 작성 형태에 따르면 간단히 말하면 함수 안에 함수가 중첩되어 있는 것입니다. 팀 개발에서는 이름 충돌을 방지하기 위해 일반적으로 해당 코드를 전역 범위에 노출되지 않도록 클로저 형식으로 래핑합니다. 하지만 단점은 내부 변수가 즉시 재활용되지 않고, 메모리 오버플로의 위험이 있다는 점입니다.