폐쇄의 궁극적 해석

소, 우리는 또 일부 기능적인 개념을 가지고 돌아왔다.문을 닫다
나는 내가 아직 충분하게 말하지 않았는지 모르겠지만, 대부분의 함수식 프로그래밍 개념은 수학 개념에서 깨우침을 얻었다. 이것이 바로 그들이 이해하기 어려운 이유일 것이다.
그렇다면'끝'이라는 단어는 무슨 뜻입니까? 이 개념을 이렇게 특별하게 만들어서 내가 말하고자 하는 것은 무엇입니까?
우선 수학 개념 자체를 검사해 봅시다. 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을 하고 입력xy이 유형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]] 속성에도 추가된다.
나는 이것이 끝났으면 좋겠다. 지금 우리 용례를 좀 보자.
그러나 클로즈업은 프로그래밍에서 가장 혁명적인 개념 중 하나라고 미리 말해야 한다.나도 설득했으면 좋겠어.

닫기

  • 부분 신청
  • 카레
  • 패키지

  • 상태함수
  • 모방 행위
  • 메모
  • 성형 함수
  • 모듈 모드
  • 발전기 기능
  • Async/Await 키워드(yea.)
  • Phew, 클립이 얼마나 강한지 탐색하는 것은 막을 수 없을 것이다. 이 아주 간단한 개념이 모든 위대한 실현에 의해 대체될 수 있다고 상상해 보자.
    솔직히 말하면, 그 중 일부 개념들은 함수식 프로그래밍 모델을 만들어 냈다.왜 그런지 알아맞혀 보세요. 클립은 함수식 프로그래밍의 핵심 기둥 중 하나이기 때문입니다.
    아마도 그중에서 가장 정교한 것일 것이다. 에스 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.


    나를 따르다

  • Github


  • Website
  • 좋은 웹페이지 즐겨찾기