レッスンに戻る

ログイン用の部分的なアプリケーション

重要性: 5

このタスクは Ask losing this 少しより複雑なバリアントです。

user オブジェクトが修正されました。今、2つの関数 loginOk/loginFail の代わりに、単一の関数 user.login(true/false) があります。

下のコードでは、何を渡すと ok として user.login(true) を、fail として user.login(fail) を呼ぶでしょうか?

function askPassword(ok, fail) {
  let password = prompt("Password?", '');
  if (password == "rockstar") ok();
  else fail();
}

let user = {
  name: 'John',

  login(result) {
    alert( this.name + (result ? ' logged in' : ' failed to log in') );
  }
};

askPassword(?, ?); // ?

変更はハイライトされた箇所の修正だけにしてください。

  1. ラッパー関数、簡単化のためにアローを使う:

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

    これで外部変数から user を取得し、通常の方法で実行します。

  2. もしくは、user をコンテキストとして使い、正しい1つ目の引数を持つ user.login からの部分関数を作ります:

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