돌아가기

로그인에 부분 적용하기

중요도: 5

이 과제는 this 값이 undefined인 함수 고치기를 변형한 좀 더 복잡한 과제입니다.

여기서는 user 객체를 수정해 user가 loginOk, loginFail 대신에 오직 하나의 함수 user.login(true·false)만 가질 수 있게 해놓았습니다.

user.login(true)ok, user.login(false)fail을 호출하게 하려면 askPassword에 무엇을 넘겨줘야 할까요?

function askPassword(ok, fail) {
  let password = prompt("비밀번호를 입력해주세요.", '');
  if (password == "rockstar") ok();
  else fail();
}

let user = {
  name: 'John',

  login(result) {
    alert( this.name + (result ? ' 로그인 성공' : ' 로그인 실패') );
  }
};

askPassword(?, ?); // ?

색칠된 줄의 물음표 부분만 수정해야 합니다.

  1. 래퍼 함수나 화살표 함수를 사용하면 간결하게 원하는 기능을 구현할 수 있습니다.

    askPassword(() => user.login(true), () => user.login(false));

    이 방법을 사용하면 askPassword는 외부 변수에서 user를 가져오기 때문에 원하는 결과를 얻을 수 있습니다.

  2. 컨텍스트가 user이면서 올바른 첫 번째 인수가 있는 부분 적용 함수를 만들면 원하는 기능을 구현할 수 있습니다.

    askPassword(user.login.bind(user, true), user.login.bind(user, false));