나는 codewars의 퍼즐에 대한 해결책을 찾고 있었고 그것이 왜 효과가 있는지 이해할 수 없습니다. 빼기 ()는 어떻게 작동합니까?
function makeNum(num, func) {
if (func === undefined) {
return num;
} else {
return func(num);
}
}
function three(func) {
return makeNum(3, func);
}
function eight(func) {
return makeNum(8, func);
}
function minus(right) {
return function(left) {
return left - right;
};
}
console.log(eight(minus(three()))); // will log out 5
답변
조금 복잡합니다. 🙂
console.log(eight(minus(three())));
내부에서 실행되므로 다음과 같이 진행하십시오.
three()
–makeNum(3, undefined)
반환하고 반환하는 것을 반환합니다.makeNum(3, undefined)
를 리턴3
하므로 리턴 값입니다.minus(3)
– 전화minus
, 전달3
등right
.minus
를 닫는 새 함수를 반환합니다right
.eight(...)
-호출 한 함수가있는makeNum(8, fnFromMinus)
위치를 호출fnFromMinus
합니다minus(3)
.makeNum(8, fnFromMinus)
하지fnFromMinus
를 전달8
등left
.fnFromMinus
의 결과를 반환합니다left - right
(즉 기억right
이다3
,fnFromMinus
그 위에 폐쇄을).
이후 8 - 3
이며 5
, 최종 결과는 5
, 어떤 console.log
돌아갑니다.
인스트루먼트 된 버전은 다음과 같습니다.
답변
단계별로 작업하면 실제로 그렇게 복잡하지 않습니다. 내부에서 밖으로 작업합시다. 부름:
three()
매개 변수가 없으면 정의되지 않은 값을 func로 전달한다는 의미입니다. 따라서 다음과 같이 말합니다.
makeNum(3, undefined)
makeNum에서 func이 정의되지 않은 것을 발견하면 num (3)을 반환합니다.
그래서 우리는 이것을 다음으로 줄였습니다.
eight(minus(3))
이제 어떻게 보자
minus(3)
평가합니다. 마이너스는 제공 한 매개 변수가 3임을 확인하므로 “left”매개 변수를 받아들이고 이미 제공 한 3을 빼는 함수를 반환합니다. 실행되지 않습니다. “왼쪽”매개 변수로 호출되기를 기다리면서 3을 뺄 수 있습니다.
그래서 우리는 이것을 다음으로 줄였습니다.
eight(function(left){
return left - 3;
})
이제 이것이 어떻게 평가되는지 봅시다. func 매개 변수를이 함수로하여 8을 호출합니다.
function(left){
return left - 3;
}
그런 다음 8 과이 함수를 전달하여 makeNum에 다음과 같이 표시합니다.
makeNum(8, func)
그런 다음 makeNum은 func이 제공되었고 정의되지 않은 것을 확인하여 func (num)을 전달하는 것과 동일한 8 개의 함수로 다시 반환합니다.
8 - 3
여덟 가지 기능으로 돌아갑니다. 8 개의 함수는 해당 값을 수신 한 후 리턴합니다. 그래서 우리는 이것을 다음으로 줄였습니다.
5
콘솔에 기록됩니다.
답변
minus
매개 변수가 전달 될 때마다 호출마다 새로운 함수를 리턴합니다. 리턴 된 함수가 호출되면 전달 된 매개 변수 외에도 호출 될 때 전달 된 매개 변수를 참조 할 수 있습니다. 이것은 JavaScript에서 함수를 카레하는 한 가지 방법입니다.
답변
이 코드는 js와 같은 함수형 프로그래밍 언어에서 고차 함수의 예입니다. 자바 스크립트 함수는 객체로 취급되며 전달 및 반환 될 수도 있습니다.
고차 함수는 함수를 인수로 받거나 함수를 출력으로 반환하는 함수입니다.
minus
기본적으로 익명 ( 정의 된 이름이없는 함수) 함수를 다음과 같이 반환합니다 .
function(left) {
return left - 3; //right = 3
};
전달 될 때이 함수 eight
는 func(8)
다음 과 같이 호출 됩니다.5
답변
그것을 보는 또 다른 방법-이 줄을 다시 작성할 수 있습니다.
console.log(eight(minus(three())));
같이:
const threeResult = three(); // = 3
const minusResult = minus(threeResult); // = a function that subtracts 3
const eightResult = eights(minusResult); // = 5