JavaScript 의 익명 재 귀적

원문: Anonymous Recursion in JavaScript
저자: Simeon Velichkov
(
  (
    (f) => f(f)
  )
  (
    (f) =>
      (l) => {
        console.log(l)
        if (l.length) f(f)(l.slice(1))
        console.log(l)
      }
  )
)
(
  [1, 2, 3]
)

예, 이것 이 바로 여러분 에 게 공유 하고 자 하 는 재 미 있 는 예 입 니 다.이 예 는 다음 과 같은 특성 을 포함한다. 폐쇄 하 다, 자체 실행 함수, 화살표 함수, 함수 식 프로 그래 밍익명 귀속.
위 코드 를 브 라 우 저 콘 솔 에 복사 하여 붙 일 수 있 습 니 다. 인쇄 결 과 는 다음 과 같 습 니 다.
[ 1, 2, 3 ]
[ 2, 3 ]
[ 3 ]
[]
[]
[ 3 ]
[ 2, 3 ]
[ 1, 2, 3 ]

함수 식 프로 그래 밍 하면 Scheme (JavaScript 가 참고 한 언어 중 하나) 로 작 성 된 유사 한 예 가 있 습 니 다.
(
  (
    (lambda (f) (f f))
    (lambda (f)
      (lambda (l)
        (print l)
        (if (not (null? l)) ((f f) (cdr l)))
        (print l)
      )
    )
  )
  '(1 2 3)
)

Unwind
다른 많은 프로 그래 밍 언어 와 마찬가지 로 함수 호출 은 함수 이름 뒤에 괄호 () 를 추가 하여 이 루어 집 니 다.
function foo () { return 'hey' }
foo()

자 바스 크 립 트 에 서 는 괄호 로 임의의 표현 식 을 패키지 할 수 있 습 니 다.
('hey', 2+5, 'dev.to')

위의 코드 반환 결 과 는 'dev.to' 자바 스 크 립 트 가 마지막 표현 식 을 결과 로 되 돌려 주기 때 문 입 니 다.
괄호 () 로 익명 함 수 를 감 싸 면 그 결 과 는 익명 함수 자체 임 을 나타 낸다.
(function () { return 'hey' })

이 자 체 는 쓸모 가 없습니다. 익명 함수 가 이름 이 없 기 때문에 초기 화 할 때 바로 호출 되 지 않 는 한 인용 할 수 없습니다.
일반 함수 처럼 우 리 는 그 뒤에 괄호 () 를 추가 하여 호출 할 수 있다.
(function () { return 'hey' })()

화살표 함수 도 사용 할 수 있 습 니 다:
(() => 'hey')()

마찬가지 로 익명 함수 뒤에 괄호 () 를 추가 하여 함 수 를 집행 하 는데 이것 은 자체 실행 함수 라 고 부른다.
폐쇄 하 다
폐쇄 하 다 함수 와 이 함수 성명 문법 환경의 조합 을 가리킨다.결합 화살표 기능, 우 리 는 다음 과 같이 정의 할 수 있다.
var foo = (hi) => (dev) => hi + ' ' + dev

콘 솔 에서 상기 함 수 를 호출 하면 인쇄 합 니 다 hey dev.to:
foo('hey')('dev.to')

내부 함수 역할 영역 에서 외부 함수 의 인자 hi 를 방문 할 수 있 습 니 다.
다음 코드 는 상기 코드 와 같 습 니 다.
function foo (hi) {
  return function (dev) { return hi + ' ' + dev }
}

실행 한 버 전 은 다음 과 같 습 니 다.
(
  (hi) =>
    (
      (dev) => `${hi} ${dev}`
    )
    ('dev.to')
)
('hey')

우선, hey 을 매개 변수 hi 의 값 으로 최 외층 작용 역 의 함수 에 전달 한 다음 에 이 함 수 는 다른 자체 집행 함수 로 되 돌려 줍 니 다.dev.to 매개 변수 dev 의 값 으로 내부 함수 에 전달 하고 마지막 으로 이 함 수 는 최종 값 을 되 돌려 줍 니 다. 'hey dev.to'더 깊이
위 와 같은 자체 실행 함수 의 수정 버 전:
(
  (
    (dev) =>
      (hi) => `${hi} ${dev}`
  )
  ('dev.to')
)
('hey')

주의해 야 할 것 은 자체 실행 함수폐쇄 하 다 를 초기 화 와 포장 상태 로 사용 하 는 것 이다. 다음은 또 다른 예 를 살 펴 보 자.
익명 귀속
우리 의 최초의 예 로 돌아 가서 이번 에는 주석 을 추가 합 니 다.
(
  (
    (f) => f(f) // 3.
  )
  (
    (f) => // 2.
      (l) => { // 4.
        console.log(l)
        if (l.length) f(f)(l.slice(1))
        console.log(l)
      }
  )
)
(
  [1, 2, 3] // 1.
)
  • 입력 함수 [1, 2, 3] 가 최 외층 작용 역
  • 에 전달
  • 전체 함 수 를 매개 변수 로 위 함수 에 전달 합 니 다
  • 이 함 수 는 아래 함 수 를 매개 변수 f 의 값 으로 수신 한 다음 에 자체 호출
  • 2. 호출 된 결 과 를 함수 3. 로 되 돌려 줍 니 다. 이 함 수 는 최 외층 작용 역 을 만족 시 키 는 함수 이기 때문에 입력 배열 을 4. 매개 변수 로 받 는 값
  • 입 니 다.
    결과 가 왜 그 랬 는 지 에 대해 서 는 재 귀 내부 에 함수 l 에 대한 인용 으로 입력 배열 f 을 받 았 기 때문이다.그래서 그렇게 호출 할 수 있 습 니 다.
    f(f)(l.slice(1))

    주의 하 세 요. l 은 닫 힌 패키지 이기 때문에 우 리 는 그것 을 호출 하면 입력 배열 의 가장 안쪽 함수 에 접근 할 수 있 습 니 다.
    목적 을 설명 하기 위해 첫 번 째 f 문 구 는 위 에서 아래로, 두 번 째 문 구 는 아래 에서 위로 돌아 가 는 것 을 나타 낸다.
    결론.
    이 글 을 좋아 하고 새로운 것 을 배 웠 으 면 좋 겠 습 니 다.패키지, 자체 실행 함수, 함수 식 프로 그래 밍 모드 는 흑 마법 이 아 닙 니 다.그들 은 이해 하기 쉽 고 놀 기 쉬 운 간단 한 원칙 을 따른다.
    그럼 에 도 불구 하고 언제 사용 하 는 지, 언제 사용 하지 않 는 지 를 키 워 야 한다.코드 를 유지 하기 어려워 지면 재 구성 에 좋 은 아이디어 가 될 수 있 습 니 다.
    그러나 이런 기본 기술 을 이해 하 는 것 은 뚜렷 하고 우아 한 해결 방안 을 만 들 고 자신 을 향상 시 키 는 데 중요 하 다.
    Happy Coding!

    좋은 웹페이지 즐겨찾기