JavaScript의 익명 반복
14200 단어 recursionclosuresjavascript
(
(
(f) => f(f)
)
(
(f) =>
(l) => {
console.log(l)
if (l.length) f(f)(l.slice(1))
console.log(l)
}
)
)
(
[1, 2, 3]
)
그래, 이런 일이 있다. 나는 이것이 재미있는 예로 나눌 것이라고 생각한다.그것의 특징은 closures,self-executing functions,arrow functions,functional programming와anonymous recursion이다.이러한 예는 브라우저의 콘솔에서 복사/붙여넣을 수 있습니다.결과는 다음과 같습니다.
[ 1, 2, 3 ]
[ 2, 3 ]
[ 3 ]
[]
[]
[ 3 ]
[ 2, 3 ]
[ 1, 2, 3 ]
함수식 프로그래밍에 대해 말하자면, 다음은 Scheme 의 유사한 예시 (자바스크립트는 그 중의 한 언어의 영향을 받는다) 이다.(
(
(lambda (f) (f f))
(lambda (f)
(lambda (l)
(print l)
(if (not (null? l)) ((f f) (cdr l)))
(print l)
)
)
)
'(1 2 3)
)
펼치다
다른 많은 프로그래밍 언어와 마찬가지로 함수를 호출하는 방법은 함수 이름 뒤에 괄호
()
를 붙이는 것이다.function foo () { return 'hey' }
foo()
JavaScript에서는 괄호 안에 원하는 수의 표현식을 포함할 수 있습니다.('hey', 2+5, 'dev.to')
상기 코드 세션의 결과는 'dev.to'
입니다.JavaScript가 마지막 표현식을 결과로 반환했기 때문입니다.단일 익명 (lambda) 함수를 괄호
()
에 포장하면 결과는 anonymous function 자체가 된다는 것을 의미합니다.(function () { return 'hey' })
익명 함수에는 이름이 없기 때문에 초기화 과정에서 바로 호출되지 않으면 인용할 수 없습니다.일반 함수와 마찬가지로 우리는 그 뒤에 괄호
()
를 붙여서 그것을 호출할 수 있다.(function () { return 'hey' })()
화살표 기능도 마찬가지입니다.(() => 'hey')()
마찬가지로 익명 함수 뒤에 괄호()
를 붙이는 것은 우리가 그것을 실행하고 있다는 것을 의미한다self-executing function라고도 부른다.가방을 닫다
Aclosure는 함수와 이 함수를 성명하는 어법 환경의 조합이다.결합arrow functions:
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')
우선hey
매개 변수를 매개 변수로 최외층의 작용역에 전달하지만 여기에는 함수가 없고 다른 표현식을 먼저 계산해야 한다.따라서 dev.to
매개 변수는 dev
매개 변수로 내부 자행 함수에 전달되고 다른 함수로 되돌아온다.마지막 함수는 최외층의 범위를 만족시키기 때문에 수신hey
매개 변수.주의해야 할 것은 self-executing functions와 closures는 초기화와 봉인 상태에 사용되며 이것은 우리가 다음 예시에서 사용할 것이다.
익명으로 귀속
우리의 첫 번째 예로 돌아가서 이번에는 주석을 추가했다.
(
(
(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
의 귀속 함수에서 인용l
함수를 위한 것이다.이렇게 하면 우리는 다음과 같다고 할 수 있다.f(f)(l.slice(1))
f
는 클립이기 때문에 입력 그룹에서 실행되는 가장 내부 함수에 접근할 수 있도록 단독으로 호출해야 합니다.해석 목적에서 제1조
console.log(l)
문장은 귀속이 위에서 아래로, 제2조 문장은 귀속이 아래에서 위임을 나타낸다.결론
나는 네가 이 문장을 좋아하고, 아울러 약간의 새로운 것을 배우기를 바란다.클립, 자동 실행 함수, 함수식 프로그래밍 모드는 흑마법이 아니다.그것들은 간단한 원칙을 따르고 이해하기 쉬우며 놀기도 재미있다.
즉, 너는 자신의 의식을 세워야 한다. 언제 그것을 사용하든지, 아니면 그것을 사용하지 않든지.코드를 유지하기 어려워지면 재구성하는 것이 좋은 생각일 수도 있습니다.
그러나 이러한 기본 기술을 이해하는 것은 깨끗하고 우아한 해결 방안을 만들고 업그레이드하는 데 매우 중요하다.
즐거운 코딩!
Reference
이 문제에 관하여(JavaScript의 익명 반복), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/simov/anonymous-recursion-in-javascript텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)