댓글 검색 목록

[javascript] JavaScript의 어려운 부분 마스터하기 : Closure II

페이지 정보

작성자 운영자 작성일 20-09-05 14:32 조회 507 댓글 0

연습 6 


콜백을 첫 번째 매개 변수로 받아들이고 콜백을 두 번째 매개 변수로 호출하기 전에 밀리 초 단위로 대기하는 함수 지연을 작성합니다. wait 후 추가 인수는 호출 될 때 func에 제공됩니다. 힌트 : 연구 setTimeout (); 


해결책 6 


function delay(func, wait, ...rest) {
  function delayRun() {
    func(...rest);
  }
  setTimeout(delayRun, wait);
}


여기에서 몇 가지 사항에 유의해야 합니다. 우선 나머지 매개 변수를 사용하여 다음 매개 변수가 모두 내부 함수로 전달되는지 확인합니다.


둘째, 기술적으로 반환하는 함수는 아무것도 반환하지 않습니다. 단순히 browser/node.js에서 제공하는 API 인 setTimeout()을 사용합니다. 대기 밀리 초의 지연으로 delayRun 함수를 호출하는 것은 setTimeout입니다. 

그러나 클로저 덕분에 delayRun 내에서 우리는 여전히 delay에 전달 된 모든 매개 변수에 액세스 할 수 있습니다.


연습 7 


이름 배열을 받아들이고 함수를 반환하는 함수 rollCall을 작성합니다. 반환 된 함수가 처음 호출 될 때 콘솔에 이름을 기록해야 합니다. 두 번째로 호출 될 때 모든 이름이 호출 될 때까지 두 번째 이름을 콘솔에 기록해야 합니다. 모든 이름이 호출되면 'Everyone accounted for'를 기록해야 합니다. 


function rollCall() {}

const rollCaller = rollCall(["Victoria", "Juan", "Ruth"]);
rollCaller(); // => should log 'Victoria'
rollCaller(); // => should log 'Juan'
rollCaller(); // => should log 'Ruth'
rollCaller(); // => should log 'Everyone accounted for'


해결책 7 


function rollCall(names) {
  let counter = 0;
  function runCall() {
    if (counter < names.length) {
      console.log(names[counter]);
      counter++;
    } else {
      console.log("Everyone accounted for");
    }
  }
  return runCall;
}


이것은 함수가 호출 된 횟수에 따라 다른 것을 출력해야 한다는 점에서 연습 5와 유사합니다. 따라서 즉시 생각해야 합니다. 카운터가 필요하며 이 카운터는 외부 범위에 있어야 합니다. 그 후에는 매우 간단합니다. 함수가 배열을 수신하고 함수가 호출 된 횟수에 따라 해당 배열의 다른 요소를 console.log하면 됩니다. 단순하지만 너무 아름답습니다!


연습 8 


함수 (하나의 인수를 허용 함)와 문자열 (암호 역할을 함)을 허용하는 함수 saveOutput을 작성하십시오. 그런 다음 saveOutput은 암호 문자열이 인수로 전달되는 경우를 제외하고 전달 된 함수와 똑같이 작동하는 함수를 반환합니다. 

이 경우 반환 된 함수는 이전에 전달 된 모든 인수가 키로 포함 된 객체를 반환하고 해당 출력을 값으로 반환합니다. 


function saveOutput() {}
const multiplyBy2 = function (num) {
  return num * 2;
};
const multBy2AndLog = saveOutput(multiplyBy2, "boo");
console.log(multBy2AndLog(2));
// => should log 4
console.log(multBy2AndLog(9));
// => should log 18
console.log(multBy2AndLog("boo"));
// => should log { 2: 4, 9: 18 }


해결책 8 


function saveOutput(func, magicWord) {
  const log = {};
  function funcAndLog(num) {
    if (num !== magicWord) {
      log[num] = func(num);
      return log[num];
    } else {
      return log;
    }
  }
  return funcAndLog;
}


이제 우리는 함수의 메모리를 단순한 카운터 이상으로 확장하고 있습니다. 단순히 함수가 호출 된 횟수를 계산하는 대신 함수가 받는 모든 매개 변수와 함수가 반환하는 출력 값을 추적해야 합니다.


그래서 우리는 빈 객체가 필요하고,이 객체는 그것이 영속적이도록 외부 범위에 있어야 합니다. 그 외에도 다소 간단합니다. 클로저 기능에서 매직 패스워드가 주어 졌는지 확인합니다. 그렇지 않은 경우 매개 변수와 해당 값을 기록하고 해당 값을 반환합니다. 매직 패스워드가 주어 졌다면 모든 매개 변수와 이전에 저장된 반환 값을 포함하는 전체 로그 함수를 반환합니다.


연습 9 


배열을 받아들이고 함수를 반환하는 함수 cycleIterator를 만듭니다. 반환 된 함수는 0 개의 인수를 받습니다. 처음 호출 될 때 반환 된 함수는 배열의 첫 번째 요소를 반환합니다. 두 번째로 호출되면 반환 된 함수는 배열의 두 번째 요소를 반환하는 식입니다. 배열의 마지막 요소를 반환 한 후 다음 호출은 배열의 첫 번째 요소를 다시 반환하고 그 이후의 두 번째 요소를 계속합니다. 


function cycleIterator() {}
const threeDayWeekend = ["Fri", "Sat", "Sun"];
const getDay = cycleIterator(threeDayWeekend);
console.log(getDay()); // => should log 'Fri'
console.log(getDay()); // => should log 'Sat'
console.log(getDay()); // => should log 'Sun'
console.log(getDay()); // => should log 'Fri'


해결책 9 


function cycleIterator(array) {
  let counter = 0;
  function cyclingItems() {
    counter++;
    return array[(counter - 1) % array.length];
  }
  return cyclingItems;
}


이것은 함수가 호출 된 횟수를 계산하고 그에 따라 원래 매개 변수 배열에서 항목을 반환해야 한다는 점에서 연습 7과 유사합니다. 여기서 유일한 차이점은 배열 항목이 부족하면 배열의 처음으로 돌아 가야 한다는 것입니다. 따라서 기본적으로 배열을 계속 순환하려면 mod 연산자를 사용해야 합니다.


연습 10 


함수와 인수를 받아들이는 함수 defineFirstArg를 만듭니다. 또한 전달되는 함수는 하나 이상의 인수를 허용합니다. defineFirstArg는 전달 된 함수의 첫 번째 인수로 전달 된 인수와 함께 전달 된 함수를 호출하는 새 함수를 반환합니다. 전달 된 함수에 필요한 추가 인수는 반환 된 함수에 전달 되어야 합니다. 


function defineFirstArg() {}
const subtract = function (big, small) {
  return big - small;
};
const subFrom20 = defineFirstArg(subtract, 20);
console.log(subFrom20(5)); // => should log 15


해결책 10 


function defineFirstArg(func, arg) {
  function insideFn(second) {
    return func(arg, second);
  }
  return insideFn;
}


운동에 대한 설명을 읽으면 머리가 약간 돌았습니다! 그러나 고맙게도 예상되는 출력을 보면 약간 명확 해졌습니다. 기본적으로 함수는 내부 함수를 반환해야 하며 이 함수는 원래 외부 함수에 매개 변수로 제공된 함수를 실행해야 합니다.


나는 이것이 기본적으로 카레의 개념에 대한 매우 부드러운 소개라고 생각합니다.



댓글목록 0

등록된 댓글이 없습니다.

웹학교 로고

온라인 코딩학교

코리아뉴스 2001 - , All right reserved.