폐쇄의 궁극적 해석
나는 내가 아직 충분하게 말하지 않았는지 모르겠지만, 대부분의 함수식 프로그래밍 개념은 수학 개념에서 깨우침을 얻었다. 이것이 바로 그들이 이해하기 어려운 이유일 것이다.
그렇다면'끝'이라는 단어는 무슨 뜻입니까? 이 개념을 이렇게 특별하게 만들어서 내가 말하고자 하는 것은 무엇입니까?
우선 수학 개념 자체를 검사해 봅시다. typescript/javascript에 투영을 할 수 있을지도 모릅니다.
In mathematics, a set is closed under an operation if performing that operation on members of the set always produces a member of that set.
그럼요.설정회원충분히 이해할 수 있다.
아이고, 수학의 정의는 늘 얄밉다. 그러니 이것을 상식으로 간소화하자.
가령 우리가 다음과 같은 조작
x + y = z
을 하고 입력x
과 y
이 유형integer
이라면 2초 동안 변수z
의 유형을 추정해야 한다. 당연히 정수다!이것이 바로 클로즈업이다. 간단하게 말하면 정수 집합은 덧셈 연산에 있어서 닫힌 것이다. 다시 말하면 정수 간의 어떤 덧셈도 하나의 정수를 만들어 같은 집합 안에서, 즉 클로즈업이다.
그래, 이게 타자 스크립트랑 무슨 상관이야?
좋아, 이 개념을 타자 스크립트에 투영해 보자.
만약 하나의 집합에서 작업을 실행하고 이 집합의 같은 구성원을 되돌릴 때 클립이 발생한다면 typescript/javascript 또는 다른 언어에서 어떤 종류가 형식을 되돌릴 수 있습니까?
정확히 말하면 함수는 대부분의 프로그래밍 언어에서 return 키워드를 사용할 수 있는 유일한 유형이기 때문에 함수 자체도 유형을 되돌릴 수 있다.
물론 자바스크립트의 본질로 인해 함수는 first class citizens이고 한 함수는 다른 함수로 되돌아와 higher order function로 만들 수 있다.
이것이 바로 Kyle Simpson가 그의 그 엉뚱한 책You don't know JS에서 클립은 함수와만 관련이 있는 이유이다.나는 이것이 지금 의미가 있기를 바란다.
우리는 어떻게 프로그래밍에서 클립을 정의합니까?
클립을 정의하기 위해서는 자바스크립트 환경에 존재하는
lexical scope
를 미리 알아야 한다.어휘 범위
Lexical scope is when a group of nested functions have access to their defined variables and the variables that are defined in their parent scope. - Ahmed Osama
나는 이 정의가 충분히 묘사적이기를 희망하지만, 만약 그렇지 않다면, 우리는 코드 예시를 통해 그것을 검사할 것이다.
let x = 5
function firstLayer(): Function {
console.log(x)
let y = 3
return function secondLayer(): void {
console.log(y)
}
}
firstLayer()() // logs 5 then 3 to the console
그렇다면 우리는 어디에서 lexical scope
의 존재를 검사할 수 있습니까?그래, 정의를 다시 토론해 보자.
... group of nested functions...
코드의 일부분으로 표시할 수 있고, 우리는 firstLayer
함수에서 여러 함수를 되돌릴 수 있다... have access to their defined variables ...
, 물론 모든 함수는 그 작용역에서 정의된 함수... and the variables that are defined in their parent scope
에 접근할 수 있는데 이것이 바로 어법 작용역의 개념이다.이 함수들은 일부 데이터를 둘러싼 층이나 폐쇄 상자로 여겨질 수 있으며, 이 데이터는 로컬 메모리에서 분배되는 변수이다.다른 글의 주제일 수도 있다는 얘기다.
이것은 어법의 범위를 연결시킬 수 있기를 바란다.
이제 우리 주제로 돌아가자.
뭐가 끝이야?
Closure is when a function "remembers" its lexical scope even when the function is executed outside that lexical scope. - Kyle Simpson
그럼 켈이라는 정의는 무슨 뜻인가요?몇몇 코드 세션을 통해 검사를 진행합시다.
let x = 5
function firstLayer(): Function {
console.log(x)
let y = 3
return function secondLayer(): void {
console.log(y)
}
}
firstLayer()() // logs 5 then 3 to the console
응, 그래, 코드는 예전과 같다. 왜냐하면 패키지는 함수에서 변수를 정의한 다음에 외부 함수에서 함수를 되돌려 주는 것에 불과하기 때문이다.앞에서 토론한 바와 같이, 이 변수들은 어휘상에서 접근할 수 있다.그렇다면 무엇이 끝을 다르게 하는가?
클로즈업 사이의 차이는 정의
"remembers"
안에 있다. 응, 무슨 뜻이야?그러면 폐쇄를 폐쇄로 만들고 다른 어법 범위(즉 전역 범위)에서 실행할 때
firstLayer
어법 범위에서 정의된 변수를 다시 사용할 수 있는 것은 무엇입니까?전역 범위를 검사하면 y라는 변수를 발견하지 못하지만, 함수firstLayer는 로컬 메모리에 변수가 있습니다. 함수secondLayer (클립) 에 자동으로 추가됩니다.
우리는 약간의 스케치를 통해 이 점을 이해합시다.
우리 여기 뭐가 있지?
전역 메모리에서, 우리는 인용
firstLayer
이 메모리 더미의 어떤 대상 (함수) 을 가리킨다. (우리는 이것을 토론하는 또 다른 글이 있을 수도 있다.)코드 중 어느 곳에서 이 함수 도
firstLayer()
를 실행했습니다. 이 함수는 y
라는 변수를 이 함수가 분배된 로컬 메모리에 저장합니다.return 키워드는 함수의 실행을 중지하고
secondLayer
라는 함수를 되돌려줍니다. (빈칸으로 도형에서 나오는 이름) 이 함수는 변수를 사용합니다. y
그래서 곤혹스러울 수도 있다. 프로그램이 종료되면 그 프로그램에 분배된 모든 메모리가 방출된다는 것은 잘 알려져 있다.여기 있는 함수는 작은 프로그램이기 때문에 분배된 메모리, 즉 변수
y
는 방출되고 메모리에서 삭제되어야 한다.우리의
secondLayer
함수는 어떻게 그것을 이용합니까?정답은 끝입니다.
이게 켈
...when a function "remembers"...
의 뜻이에요.그런데 그럴 리가 있겠어요?엔진 덮개 아래에서 무슨 일이 일어났습니까?어디 보자.
분명히 함수
secondLayer
가 함수firstLayer
에서 되돌아올 때 컴파일러는 어휘에 사용될 수 있는 변수 a.k.ay
를 포함하여 필요한 모든 변수를 확보하고 함수secondLayer
와 [[Scopes]]
라는 특수 속성에 연결시켜 함수에 접근할 수 있는 모든 변수를 포함한다.몇 가지 인코딩 예시를 살펴봅시다.
const counter = (initial: number = 0) => ({
decrease: (step: number = 1) => (initial -= step),
increase: (step: number = 1) => (initial += step),
})
let x = counter()
console.log(x.increase(5)) // 5
console.log(x.increase()) // 6
그래서 컴파일러가 이 코드 세션을 어떻게 이해했는지 알 수 있다. 함수가 그 대상을 되돌릴 때 그 속성은 우리의 국부 변수initial
를 사용하는 함수이기 때문에 closure
대상의 [[scopes]]
속성에도 추가된다.나는 이것이 끝났으면 좋겠다. 지금 우리 용례를 좀 보자.
그러나 클로즈업은 프로그래밍에서 가장 혁명적인 개념 중 하나라고 미리 말해야 한다.나도 설득했으면 좋겠어.
닫기
솔직히 말하면, 그 중 일부 개념들은 함수식 프로그래밍 모델을 만들어 냈다.왜 그런지 알아맞혀 보세요. 클립은 함수식 프로그래밍의 핵심 기둥 중 하나이기 때문입니다.
아마도 그중에서 가장 정교한 것일 것이다. 에스 2017에 도입된 모든 async/await 키워드는 (내 생각에는) 모두 클로즈업된 일부 응용 프로그램들이다.
음, 어떤 의미에서 보면 이것은 당연히 다른 문장의 주제이다. 실제로 이런 제목 중의 대다수는 곧 다가올 주제와 같다. 그 중 하나는 이미 다른 문장에 소개되었는데, 너는 여기서 볼 수 있다. 나는 이러한 용례의 나머지 부분을 빨리 포괄할 수 있기를 바란다.
지금, 좋은 커피나 음료수를 마시며 즐거운 하루 보내세요.❤️
부록과 일부 정의
일등 공민
First class citizen is when you can pass a value of type x as a parameter to some function y, or assign it to a variable or return it from a function. In another words, if you can treat a function as if it's a string value it's a first class citizen
고급 함수
Higher order functions are functions that whether accept functions as their inputs or can return functions as their output.
나를 따르다
Reference
이 문제에 관하여(폐쇄의 궁극적 해석), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ahmedosama_st/the-ultimate-explanation-of-closures-49eh텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)