Qraft(クラフト) 資格・学習クイズアプリ

JavaScript入門 練習問題 6:関数を返す関数とクロージャー

JavaScriptの関数を返す関数について、以下のコードを実行したときのコンソールへの出力として正しいものを選んでください。

```javascript
function createCounter(start) {
console.log('カウンターを作成: ' + start);
return function() {
console.log('現在の値: ' + start);
start++;
};
}

const counter1 = createCounter(10);
const counter2 = createCounter(20);
counter1();
counter2();
counter1();
```

  1. カウンターを作成: 10 カウンターを作成: 20 現在の値: 10 現在の値: 20 現在の値: 11
  2. 現在の値: 10 現在の値: 20 現在の値: 11
  3. カウンターを作成: 10 現在の値: 10 カウンターを作成: 20 現在の値: 20 現在の値: 11
  4. カウンターを作成: 10 カウンターを作成: 20 現在の値: 10 現在の値: 20 現在の値: 10
  5. カウンターを作成: 10 カウンターを作成: 20 現在の値: 10 現在の値: 21 現在の値: 11

Qraftユーザーの成績:正答率 67%(8/12回正解)

正解と解説を見る
正解:カウンターを作成: 10 カウンターを作成: 20 現在の値: 10 現在の値: 20 現在の値: 11

createCounterは呼び出されるたびに独立したstart変数を持つ新しい関数を返します(クロージャー)。正しい出力は「カウンターを作成: 10→カウンターを作成: 20→現在の値: 10→現在の値: 20→現在の値: 11」です。

【正解の理由】
counter1とcounter2はそれぞれ別々のstart値(10と20)を記憶しており、counter1を1回目に呼ぶとstartが10→11に変化するため、2回目のcounter1()では11が表示されます。

【不正解の理由】
• 現在の値: 10→現在の値: 20→現在の値: 11:createCounter()を呼んだ時点で出力される「カウンターを作成: X」が抜けています。
• カウンターを作成: 10→現在の値: 10→カウンターを作成: 20→現在の値: 20→現在の値: 11:counter1とcounter2は先にどちらも作成されてから実行されるため、作成と実行が交互になることはありません。
• カウンターを作成: 10→カウンターを作成: 20→現在の値: 10→現在の値: 20→現在の値: 10:counter1は1回目の呼び出しでstartが10→11に変化しているため、2回目の呼び出しでは10ではなく11が出力されます。
• カウンターを作成: 10→カウンターを作成: 20→現在の値: 10→現在の値: 21→現在の値: 11:counter2のstartは20のままcounter2()が呼ばれるため、1回目の呼び出しでは21ではなく20が出力されます。

← 前の問題問題一覧次の問題 →
アプリで解いてレーティングを上げる(無料・登録不要)