Learn JavaScript

lesson ā§§ / ⧝ ¡ scope, hoisting āφāϰ closure

Module ā§Ŧ ¡ scope, hoisting āφāϰ closure

āύāĻžāĻŽ āϕ⧋āĻĨāĻžāϝāĻŧ āĻĨāĻžāϕ⧇: scope āφāϰ closure, āĻĒ⧁āϰ⧋ āĻ›āĻŦāĻŋāϟāĻž

FreeāĻĒāĻĄāĻŧāĻž

āĻāχ lesson-āĻ āϝāĻž āĻļāĻŋāĻ–āĻŦ⧇

  • āĻāĻ•āϟāĻž āύāĻžāĻŽ āϕ⧋āύ scope-āĻāϰ (file, āĻāĻ•āϟāĻž function, āύāĻžāĻ•āĻŋ āĻāĻ•āϟāĻž block), āφāϰ program-āĻāϰ āϕ⧋āĻĨāĻž āĻĨ⧇āϕ⧇ āĻ“āϟāĻž āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧ, āĻŦāϞāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āĨ¤
  • āĻāĻ•āϟāĻž āύāĻžāĻŽ āĻ–ā§‹āρāϜāĻž (lookup) āĻŦāĻžāχāϰ⧇āϰ āĻĻāĻŋāϕ⧇ āĻāĻ• scope āĻ•āϰ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇, āϝāϤāĻ•ā§āώāĻŖ āύāĻž āύāĻžāĻŽāϟāĻž āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧ āĻŦāĻž program āĻāĻ•āϟāĻž ReferenceError āĻĻāĻŋāϝāĻŧ⧇ āĻĨāĻžāĻŽā§‡āĨ¤
  • Closure āϕ⧀, āĻŦ⧁āĻāĻŋāϝāĻŧ⧇ āĻŦāϞāϤ⧇ āĻĒāĻžāϰāĻŦ⧇, āφāϰ āĻāĻŽāύ āĻāĻ•āϟāĻž counter factory āϞāĻŋāĻ–āϤ⧇ āĻĒāĻžāϰāĻŦ⧇ āϝāĻžāϰ count āĻ…āĻ¨ā§āϝ āϕ⧋āύ⧋ code āϛ⧁āρāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻžāĨ¤

Kenji-āϰ āĻŦāχāϝāĻŧ⧇āϰ āĻĻā§‹āĻ•āĻžāύ⧇āϰ page āϤāĻžāϰ visitor āĻ—ā§‹āύ⧇ count āύāĻžāĻŽā§‡āϰ āĻāĻ•āϟāĻž variable-āĻ, file-āĻāϰ āĻāĻ•āĻĻāĻŽ āĻ“āĻĒāϰ⧇āĨ¤ Bob āĻāĻ•āϟāĻž like button āϝ⧋āĻ— āĻ•āϰāϞ, āĻ“āϰāĻ“ āĻāĻ•āϟāĻž counter āϞāĻžāĻ—āĻŦ⧇, āϤāĻžāχ like reset āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻ“ āϞāĻŋāĻ–āϞ count = 0āĨ¤ āĻāĻ–āύ āϝāϤāĻŦāĻžāϰ like reset āĻšāϝāĻŧ, āϤāϤāĻŦāĻžāϰ āĻĻāĻŋāύ⧇āϰ āϏāĻŦ visitor-āĻāϰ āĻšāĻŋāϏāĻžāĻŦ āĻŽā§āϛ⧇ āϝāĻžāϝāĻŧ, āφāϰ āϕ⧇āω āϕ⧋āύ⧋ error āĻĻ⧇āϖ⧇ āύāĻžāĨ¤ āĻĻ⧁āĻŸā§‹ feature āĻāĻ•āϟāĻžāχ āύāĻžāĻŽ āĻ­āĻžāĻ— āĻ•āϰ⧇ āύāĻŋāĻšā§āϛ⧇, āφāϰ file-āĻāϰ āϝ⧇āϕ⧋āύ⧋ āϞāĻžāχāύ āĻ“āϟāĻž āĻŦāĻĻāϞ⧇ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāχ lesson āĻĒā§āϰāϤāĻŋāϟāĻž counter-āϕ⧇ āĻāĻ•āϟāĻž private count āĻĻ⧇āĻŦ⧇, āϝ⧇āϟāĻž āĻļ⧁āϧ⧁ āĻ“āϰ āύāĻŋāĻœā§‡āϰ code-āχ āϛ⧁āρāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

Kenji-āϰ āĻ­āĻžāĻ—āĻžāĻ­āĻžāĻ—āĻŋāϰ count

āĻāχ āĻšāϞ⧋ bug-āϟāĻž, āĻ•āϝāĻŧ⧇āĻ• āϞāĻžāχāύ⧇ āϛ⧋āϟ āĻ•āϰ⧇ āφāύāĻžāĨ¤ Kenji-āϰ addView āφāϰ Bob-āĻāϰ resetLikes āĻĻ⧁āϜāύ⧇āχ āĻāĻ•āχ count-āĻ āϞ⧇āϖ⧇āĨ¤

let count = 0;

function addView() {
  count++;
}
function resetLikes() {
  count = 0;
}

addView();
addView();
addView();
resetLikes();
addView();
console.log("views: " + count);
views: 1

āϚāĻžāϰāϜāύ visitor āĻāϏ⧇āĻ›āĻŋāϞ, āφāϰ page āĻŦāϞāϛ⧇ āĻāĻ•āϜāύāĨ¤ āĻĻ⧁āĻŸā§‹ function-āĻāϰ āϕ⧋āύ⧋āϟāĻžāχ āφāϞāĻžāĻĻāĻžāĻ­āĻžāĻŦ⧇ āϭ⧁āϞ āύāĻžāĨ¤ āĻ—ā§‹āϞāĻŽāĻžāϞāϟāĻž āĻšāϞ⧋ count āϕ⧋āĻĨāĻžāϝāĻŧ āĻĨāĻžāϕ⧇: file-āĻāϰ āĻāĻ•āĻĻāĻŽ āĻ“āĻĒāϰ⧇, āϝ⧇āĻ–āĻžāύ āĻĨ⧇āϕ⧇ āĻĒā§āϰāϤāĻŋāϟāĻž function āĻ“āϟāĻž āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϝāĻŧ āφāϰ āĻŦāĻĻāϞāĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϤāĻžāχ āϏāĻŽāĻžāϧāĻžāύ āφāϰāĻ“ āĻ­āĻžāϞ⧋ āĻāĻ•āϟāĻž function āύāĻžāĨ¤ āϏāĻŽāĻžāϧāĻžāύ āĻšāϞ⧋ āύāĻžāĻŽāϟāĻžāϰ āϜāĻ¨ā§āϝ āφāϰāĻ“ āĻ­āĻžāϞ⧋ āĻāĻ•āϟāĻž āϜāĻžāϝāĻŧāĻ—āĻž, āϝ⧇āĻ–āĻžāύ⧇ āĻļ⧁āϧ⧁ counter-āĻāϰ āύāĻŋāĻœā§‡āϰ code āĻĒ⧌āρāĻ›āĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ JavaScript āĻāχ āϜāĻžāϝāĻŧāĻ—āĻžāϟāĻžāϕ⧇ āĻŦāϞ⧇ scopeāĨ¤

Scope āĻšāϞ⧋ āĻ•āϝāĻŧ⧇āĻ• āϞāĻžāχāύ code-āĻāϰ āϚāĻžāϰāĻĒāĻžāĻļ⧇ āĻāĻ•āϟāĻž āĻŦāĻžāĻ•ā§āϏ

Scope, āĻŽāĻžāύ⧇ program-āĻāϰ āϝ⧇ āĻ…āĻ‚āĻļ⧇ āĻāĻ•āϟāĻž āύāĻžāĻŽ āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧāĨ¤ āĻāϟāĻžāϕ⧇ āĻ•āϝāĻŧ⧇āĻ• āϞāĻžāχāύ code-āĻāϰ āϚāĻžāϰāĻĒāĻžāĻļ⧇ āφāρāĻ•āĻž āĻāĻ•āϟāĻž āĻŦāĻžāĻ•ā§āϏ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻ­āĻžāĻŦā§‹āĨ¤ āĻŦāĻžāĻ•ā§āϏ⧇āϰ āϭ⧇āϤāϰ⧇ declare āĻ•āϰāĻž āύāĻžāĻŽ āĻ“āχ āĻŦāĻžāĻ•ā§āϏ⧇āϰāĨ¤ āĻŦāĻžāĻ•ā§āϏ āϤāĻŋāύ āϰāĻ•āĻŽāĨ¤

  • FileāĨ¤ File-āĻāϰ āĻāĻ•āĻĻāĻŽ āĻŦāĻžāχāϰ⧇āϰ āĻ¸ā§āϤāϰ⧇ declare āĻ•āϰāĻž āύāĻžāĻŽ āĻ“āχ file-āĻāϰ āϝ⧇āϕ⧋āύ⧋ āϜāĻžāϝāĻŧāĻ—āĻž āĻĨ⧇āϕ⧇ āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧāĨ¤
  • āĻāĻ•āϟāĻž functionāĨ¤ Function-āĻāϰ āϭ⧇āϤāϰ⧇ declare āĻ•āϰāĻž āύāĻžāĻŽ, āφāϰ āĻĒā§āϰāϤāĻŋāϟāĻž parameter, āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧ āĻļ⧁āϧ⧁ āĻ“āχ function-āĻāϰ āϭ⧇āϤāϰ āĻĨ⧇āϕ⧇āĨ¤
  • āĻāĻ•āϟāĻž blockāĨ¤ Block āĻŽāĻžāύ⧇ āĻāĻ• āĻœā§‹āĻĄāĻŧāĻž curly brace, āϝ⧇āĻŽāύ āĻāĻ•āϟāĻž if āĻŦāĻž āĻāĻ•āϟāĻž for-āĻāϰ bodyāĨ¤ āϭ⧇āϤāϰ⧇ declare āĻ•āϰāĻž let āĻŦāĻž const āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧ āĻļ⧁āϧ⧁ āĻ“āχ brace āĻĻ⧁āĻŸā§‹āϰ āĻŽāĻžāĻāĻ–āĻžāύ āĻĨ⧇āϕ⧇āĨ¤

Block-āĻāϰ āϏāĻžāĻĨ⧇ āϤ⧋āĻŽāĻžāϰ āĻĻ⧇āĻ–āĻž āĻšāϝāĻŧ⧇āϛ⧇ āφāϗ⧇āχāĨ¤ Module 4-āĻ for loop-āĻāϰ i āĻĨāĻžāĻ•āϤ āĻļ⧁āϧ⧁ loop-āĻāϰ āϭ⧇āϤāϰ⧇, āφāϰ āĻĒāϰ⧇ āĻ“āϟāĻž āĻĒāĻĄāĻŧāϤ⧇ āϗ⧇āϞ⧇ program āĻĨ⧇āĻŽā§‡ āϝ⧇āϤāĨ¤ āύāĻŋāĻšā§‡āϰ program-āĻ āϤāĻŋāύ āϰāĻ•āĻŽ āĻŦāĻžāĻ•ā§āϏāχ āφāϛ⧇āĨ¤

const shop = "Progsity Books";

function openShop() {
  const hours = "9 to 5";
  console.log(shop + " opens " + hours);
}

openShop();
if (shop.length > 5) {
  const note = "long name";
  console.log(note);
}
console.log(typeof hours, typeof note);
Progsity Books opens 9 to 5
long name
undefined undefined

shop āĻĨāĻžāϕ⧇ file-āĻ, āϤāĻžāχ openShop āĻ“āϟāĻž āĻĒāĻĄāĻŧāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ hours āĻĨāĻžāϕ⧇ function-āĻ, āφāϰ note āĻĨāĻžāϕ⧇ block-āĻāĨ¤ āĻļ⧇āώ āϞāĻžāχāύāϟāĻž āĻĻ⧁āĻŸā§‹ āĻŦāĻžāĻ•ā§āϏ⧇āϰāχ āĻŦāĻžāχāϰ⧇, āϏ⧇āĻ–āĻžāύ⧇ āϕ⧋āύ⧋ āύāĻžāĻŽā§‡āϰāχ āĻ…āĻ¸ā§āϤāĻŋāĻ¤ā§āĻŦ āύ⧇āχāĨ¤ āϝ⧇ āύāĻžāĻŽ āύ⧇āχ, āϤāĻžāϰ āϜāĻ¨ā§āϝ typeof program āĻĨāĻžāĻŽāĻžāϝāĻŧ āύāĻž, āωāĻ¤ā§āϤāϰ āĻĻ⧇āϝāĻŧ "undefined", āϤāĻžāχ āωāρāĻ•āĻŋ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āĻāϟāĻž āύāĻŋāϰāĻžāĻĒāĻĻāĨ¤ āĻŽāĻžāύ⧇ āĻāĻ•āϟāĻž āύāĻžāĻŽ āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧ āĻ“āϰ āύāĻŋāĻœā§‡āϰ āĻŦāĻžāĻ•ā§āϏ⧇āϰ āϭ⧇āϤāϰ⧇, āĻŦāĻžāχāϰ⧇ āϕ⧋āĻĨāĻžāĻ“ āύāĻžāĨ¤

āύāĻžāĻŽ āĻ–ā§‹āρāϜāĻž, āϭ⧇āϤāϰ āĻĨ⧇āϕ⧇ āĻŦāĻžāχāϰ⧇

āĻŦāĻžāĻ•ā§āϏ āĻŦāϏ⧇ āĻĨāĻžāϕ⧇ āĻ…āĻ¨ā§āϝ āĻŦāĻžāĻ•ā§āϏ⧇āϰ āϭ⧇āϤāϰ⧇āĨ¤ āĻāĻ•āϟāĻž function-āĻāϰ āĻŦāĻžāĻ•ā§āϏ āĻŦāϏ⧇ file-āĻāϰ āĻŦāĻžāĻ•ā§āϏ⧇āϰ āϭ⧇āϤāϰ⧇, āφāϰ function-āĻāϰ āϭ⧇āϤāϰ⧇āϰ āĻāĻ•āϟāĻž block āĻŦāϏ⧇ function-āĻāϰ āĻŦāĻžāĻ•ā§āϏ⧇āĨ¤ āϕ⧋āύ⧋ āϞāĻžāχāύ āĻāĻ•āϟāĻž āύāĻžāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ JavaScript āĻāĻ•āϟāĻž lookup āϚāĻžāϞāĻžāϝāĻŧ, āĻŽāĻžāύ⧇ āύāĻžāĻŽāϟāĻž āĻ–ā§‹āρāĻœā§‡āĨ¤ āφāϗ⧇ āĻ–ā§‹āρāĻœā§‡ āϞāĻžāχāύāϟāĻž āϝ⧇ āĻŦāĻžāĻ•ā§āϏ⧇ āφāϛ⧇ āϏ⧇āĻ–āĻžāύ⧇, āϤāĻžāϰāĻĒāϰ āϤāĻžāϰ āϚāĻžāϰāĻĒāĻžāĻļ⧇āϰ āĻŦāĻžāĻ•ā§āϏ⧇, āĻāĻ­āĻžāĻŦ⧇ āĻŦāĻžāχāϰ⧇āϰ āĻĻāĻŋāϕ⧇āĨ¤ āĻĒā§āϰāĻĨāĻŽ āϝ⧇ āĻŦāĻžāĻ•ā§āϏ⧇ āύāĻžāĻŽāϟāĻž āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧ, āϏ⧇āϟāĻžāχ āĻœā§‡āϤ⧇āĨ¤ File-āĻāĻ“ āύāĻž āĻĨāĻžāĻ•āϞ⧇ program āĻāĻ•āϟāĻž ReferenceError āĻĻāĻŋāϝāĻŧ⧇ āĻĨ⧇āĻŽā§‡ āϝāĻžāϝāĻŧāĨ¤

Lookup āĻŦāĻžāχāϰ⧇āϰ āĻĻāĻŋāϕ⧇ āĻšāĻžāρāĻŸā§‡, āϭ⧇āϤāϰ⧇āϰ āĻĻāĻŋāϕ⧇ āĻ•āĻ–āύ⧋ āύāĻž āĻ–ā§‹āρāϜāĻž āĻļ⧁āϰ⧁ āĻšāϝāĻŧ āϝ⧇ āĻŦāĻžāĻ•ā§āϏ āϚāϞāϛ⧇ āϏ⧇āĻ–āĻžāύ āĻĨ⧇āϕ⧇, āϤāĻžāϰāĻĒāϰ āĻŦāĻžāχāϰ⧇āϰ āĻĻāĻŋāϕ⧇ file shop, makeCounter, ticket makeCounter() call count next() call āύāĻŋāĻœā§‡āϰ āϕ⧋āύ⧋ āύāĻžāĻŽ āύ⧇āχ āϚāϞāϛ⧇: count++, āϤāĻžāϰāĻĒāϰ shop 1. next-āĻ āĻ–ā§‹āρāĻœā§‹ āĻāĻ–āĻžāύ⧇ āĻ•āĻŋāϛ⧁ āύ⧇āχ 2. makeCounter-āĻāϰ āĻŦāĻžāĻ•ā§āϏ count āĻĒāĻžāĻ“āϝāĻŧāĻž āϗ⧇āϞ 3. file shop āĻĒāĻžāĻ“āϝāĻŧāĻž āϗ⧇āϞ āĻ–ā§‹āρāϜāĻž āĻ•āĻ–āύ⧋ āϭ⧇āϤāϰ⧇āϰ āĻĻāĻŋāϕ⧇ āϝāĻžāϝāĻŧ āύāĻž: file count āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϝāĻŧ āύāĻžāĨ¤

āĻŽāĻžāύ⧇ āϭ⧇āϤāϰ⧇āϰ āĻŦāĻžāĻ•ā§āϏ āϤāĻžāϰ āϚāĻžāϰāĻĒāĻžāĻļ⧇āϰ āϏāĻŦ āĻŦāĻžāĻ•ā§āϏ⧇āϰ āĻĒā§āϰāϤāĻŋāϟāĻž āύāĻžāĻŽ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϝāĻŧ, āφāϰ āĻŦāĻžāχāϰ⧇āϰ āĻŦāĻžāĻ•ā§āϏ āϭ⧇āϤāϰ⧇āϰ āĻŦāĻžāĻ•ā§āϏ⧇āϰ āĻ•āĻŋāϛ⧁āχ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϝāĻŧ āύāĻžāĨ¤ āĻĒāϰ⧇āϰ program āĻĻ⧁āχ āĻĻāĻŋāĻ•āχ āĻĻ⧇āĻ–āĻžāϝāĻŧāĨ¤

const rate = 0.05;

function addTax(price) {
  const tax = price * rate;
  return price + tax;
}

console.log(addTax(200));
console.log(tax);
210
ReferenceError: tax is not defined

addTax-āĻāϰ āϭ⧇āϤāϰ⧇ rate āϖ⧁āρāϜāϤ⧇ āĻ—āĻŋāϝāĻŧ⧇ function-āĻāϰ āĻŦāĻžāĻ•ā§āϏ⧇ āĻ•āĻŋāϛ⧁ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧāύāĻŋ, āĻ–ā§‹āρāϜāĻž āĻāĻ• āϧāĻžāĻĒ āĻŦāĻžāχāϰ⧇ āĻ—āĻŋāϝāĻŧ⧇ āĻ“āϟāĻž āĻĒ⧇āϝāĻŧ⧇āϛ⧇ file-āĻāĨ¤ āĻļ⧇āώ āϞāĻžāχāύ⧇ tax-āĻāϰ āĻ–ā§‹āρāϜāĻž āĻļ⧁āϰ⧁ āĻšāϝāĻŧ⧇āϛ⧇ file āĻĨ⧇āϕ⧇, āϝ⧇āϟāĻž āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻŦāĻžāχāϰ⧇āϰ āĻŦāĻžāĻ•ā§āϏ, āφāϰ āϝāĻžāĻ“āϝāĻŧāĻžāϰ āĻŽāϤ⧋ āφāϰ āϕ⧋āύ⧋ āϜāĻžāϝāĻŧāĻ—āĻž āĻ›āĻŋāϞ āύāĻžāĨ¤ āĻŽāĻžāύ⧇ āĻ–ā§‹āρāϜāĻž āĻŦāĻžāχāϰ⧇āϰ āĻĻāĻŋāϕ⧇ āĻšāĻžāρāĻŸā§‡, āφāϰ āĻĨāĻžāĻŽā§‡ āĻĒā§āϰāĻĨāĻŽ āĻŽāĻŋāϞ⧇ āϝāĻžāĻ“āϝāĻŧāĻž āύāĻžāĻŽā§‡, āύāϝāĻŧāϤ⧋ file-āĻ āĻĒ⧌āρāϛ⧇ error āĻĻāĻŋāϝāĻŧ⧇āĨ¤

āĻĒā§āϰāϤāĻŋāϟāĻž call āĻāĻ•āϟāĻž āύāϤ⧁āύ āĻŦāĻžāĻ•ā§āϏ āĻŦāĻžāύāĻžāϝāĻŧ

Function āϞ⧇āĻ–āĻžāϰ āϏāĻŽāϝāĻŧ āĻ“āϰ āĻŦāĻžāĻ•ā§āϏ āĻāĻ•āĻŦāĻžāϰāχ āϤ⧈āϰāĻŋ āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧ, āĻŦā§āϝāĻžāĻĒāĻžāϰāϟāĻž āĻāĻŽāύ āύāĻžāĨ¤ Function āϝāϤāĻŦāĻžāϰ call āĻšāϝāĻŧ, āϤāϤāĻŦāĻžāϰ āĻāĻ•āϟāĻž āύāϤ⧁āύ āĻŦāĻžāĻ•ā§āϏ āϤ⧈āϰāĻŋ āĻšāϝāĻŧ, āφāϰ āϭ⧇āϤāϰ⧇āϰ āύāĻžāĻŽāϗ⧁āϞ⧋ āϏ⧇āĻ–āĻžāύ⧇ āύāϤ⧁āύ āĻ•āϰ⧇ āĻļ⧁āϰ⧁ āĻšāϝāĻŧāĨ¤ Call āĻļ⧇āώ āĻšāϞ⧇ āĻŦāĻžāĻ•ā§āϏāϟāĻž āϏāĻžāϧāĻžāϰāĻŖāϤ āĻĢ⧇āϞ⧇ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧāĨ¤ Module 5-āĻ āϤ⧁āĻŽāĻŋ āĻĻ⧇āϖ⧇āĻ› call-āϗ⧁āϞ⧋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻžāϰ āĻ“āĻĒāϰ āφāϰ⧇āĻ•āϟāĻž āϜāĻŽā§‡āĨ¤ āĻ“āχ āĻĒā§āϰāϤāĻŋāϟāĻž call-āĻāϰ āύāĻŋāĻœā§‡āϰ āĻāĻ•āϟāĻž āĻŦāĻžāĻ•ā§āϏ āĻ›āĻŋāϞāĨ¤

function visit(name) {
  let cups = 0;
  cups++;
  console.log(name + " has had " + cups + " cup");
}

visit("Zara");
visit("Zara");
Zara has had 1 cup
Zara has had 1 cup

āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ call āĻĒā§āϰāĻĨāĻŽāϟāĻžāϰ āĻ•āĻĨāĻž āĻŽāύ⧇ āϰāĻžāϖ⧇ āύāĻžāĨ¤ āĻ“āϰ let cups = 0 āφāĻŦāĻžāϰ āϚāϞ⧇āϛ⧇, āĻāĻ•āϟāĻž āύāϤ⧁āύ āĻŦāĻžāĻ•ā§āϏ⧇āĨ¤ āĻŽāĻžāύ⧇ function-āĻāϰ āϭ⧇āϤāϰ⧇āϰ āύāĻžāĻŽ āĻĒā§āϰāϤāĻŋāϟāĻž call-āĻ āύāϤ⧁āύ āĻ•āϰ⧇ āĻļ⧁āϰ⧁ āĻšāϝāĻŧāĨ¤ Kenji-āϰ counter-āĻāϰ āĻ āĻŋāĻ• āĻāϟāĻžāχ āĻ•āϰāĻž āϚāϞāĻŦ⧇ āύāĻž, āφāϰ āĻĒāϰ⧇āϰ āĻ…āĻ‚āĻļ⧇ āĻŦ⧇āϰ āĻšāĻ“āϝāĻŧāĻžāϰ āϰāĻžāĻ¸ā§āϤāĻžāĨ¤

Closure āϤāĻžāϰ āĻŦāĻžāĻ•ā§āϏāϟāĻžāϕ⧇ āĻŦāĻžāρāϚāĻŋāϝāĻŧ⧇ āϰāĻžāϖ⧇

āĻāĻŦāĻžāϰ āφāϏāϞ āĻ•ā§ŒāĻļāϞāϟāĻžāĨ¤ āĻāĻ•āϟāĻž function-āĻāϰ āϭ⧇āϤāϰ⧇ āϤ⧈āϰāĻŋ āφāϰ⧇āĻ•āϟāĻž function āĻŽāύ⧇ āϰāĻžāϖ⧇, āĻ“ āϕ⧋āύ āĻŦāĻžāĻ•ā§āϏ⧇ āϤ⧈āϰāĻŋ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ āĻŦāĻžāχāϰ⧇āϰ function āϝāĻĻāĻŋ āϭ⧇āϤāϰ⧇āϰ function-āϟāĻž return āĻ•āϰ⧇, āϤāĻžāĻšāϞ⧇ āĻŦāĻžāχāϰ⧇āϰ call āĻļ⧇āώ āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ“āϰ āĻŦāĻžāĻ•ā§āϏāϟāĻž āĻĢ⧇āϞ⧇ āĻĻ⧇āĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧ āύāĻžāĨ¤ āϭ⧇āϤāϰ⧇āϰ function āĻāĻ–āύ⧋ āĻ“āϟāĻžāϕ⧇ āϧāϰ⧇ āϰ⧇āϖ⧇āϛ⧇āĨ¤ āĻāĻ•āϟāĻž function āφāϰ āĻ“ āϝ⧇ āĻŦāĻžāĻ•ā§āϏāϟāĻž āĻŽāύ⧇ āϰāĻžāϖ⧇, āĻĻ⧁āĻŸā§‹ āĻŽāĻŋāϞāĻŋāϝāĻŧ⧇ āĻŦāϞ⧇ closureāĨ¤

āύāĻŋāĻšā§‡āϰ program-āϟāĻž āĻāĻ• āϧāĻžāĻĒ āĻāĻ• āϧāĻžāĻĒ āĻ•āϰ⧇ āϚāĻžāϞāĻžāĻ“āĨ¤ makeCounter() call 1-āĻāϰ āĻŦāĻžāĻ•ā§āϏāϟāĻžāϰ āĻĻāĻŋāϕ⧇ āĻšā§‹āĻ– āϰāĻžāĻ–ā§‹āĨ¤ makeCounter return āĻ•āϰāĻžāϰ āĻĒāϰ⧇āĻ“ āĻ“āϟāĻž āϟāĻŋāϕ⧇ āĻĨāĻžāϕ⧇, āφāϰ ticket-āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻž call-āĻ āĻ“āϰ āϭ⧇āϤāϰ⧇ count āĻŦāĻžāĻĄāĻŧ⧇āĨ¤

makeCounter āĻāĻ•āĻŦāĻžāϰ āϚāϞ⧇, āφāϰ count āϰāĻžāĻ–āĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻž scope āĻŦāĻžāύāĻžāϝāĻŧāĨ¤ āĻ“ next return āĻ•āϰ⧇ āĻļ⧇āώ āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧ, āĻ•āĻŋāĻ¨ā§āϤ⧁ scope-āϟāĻž āĻŦ⧇āρāĻšā§‡ āĻĨāĻžāϕ⧇, āĻ•āĻžāϰāĻŖ ticket āĻāĻ–āύ⧋ āĻ“āϟāĻžāϕ⧇ āϧāϰ⧇ āϰ⧇āϖ⧇āϛ⧇āĨ¤ ticket-āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻž call count āĻ–ā§‹āρāĻœā§‡, āĻāĻ• āϧāĻžāĻĒ āĻŦāĻžāχāϰ⧇ āĻĒāĻžāϝāĻŧ, 1 āϝ⧋āĻ— āĻ•āϰ⧇, āφāϰ shop āĻĒāĻžāϝāĻŧ file-āĻāĨ¤ File āύāĻŋāĻœā§‡ count āϖ⧁āρāϜāϞ⧇ āĻĒāĻžāϝāĻŧ āύāĻž: ReferenceError: count is not definedāĨ¤

āϧāĻžāĻĒāϞāĻžāχāύāϝ⧇ scope āϚāϞāϛ⧇āĻ–ā§‹āρāϜāĻžāϕ⧀ āĻšāϞ⧋
11fileāύ⧇āχFile-āĻāϰ scope-āĻ āφāϛ⧇ shop āφāϰ makeCounterāĨ¤ āφāϰ āĻ•āĻŋāϛ⧁ āĻāĻ–āύ⧋ āύ⧇āχāĨ¤
23makeCounter() call 1āύ⧇āχmakeCounter call āĻ•āϰāϤ⧇āχ āĻāχ call-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻž āύāϤ⧁āύ scope āϤ⧈āϰāĻŋ āĻšāϞ⧋, count āĻĨāĻžāϕ⧇ āĻ“āĻ–āĻžāύ⧇āĨ¤
39fileāύ⧇āχmakeCounter return āĻ•āϰ⧇ āĻĢ⧇āϞ⧇āϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ“āϰ scope āĻŦ⧇āρāĻšā§‡ āφāϛ⧇, āĻ•āĻžāϰāĻŖ ticket āĻāĻ–āύ⧋ āĻ“āϟāĻžāϕ⧇ āϧāϰ⧇ āϰ⧇āϖ⧇āϛ⧇āĨ¤
45next() call 1count: next() call 1, makeCounter() call 1, āĻĒāĻžāĻ“āϝāĻŧāĻž āϗ⧇āϞcount++ āφāϗ⧇ next-āĻāϰ āύāĻŋāĻœā§‡āϰ scope-āĻ āĻ–ā§‹āρāĻœā§‡, āĻĒāĻžāϝāĻŧ āύāĻž, āϤāĻžāϰāĻĒāϰ āĻāĻ• āϧāĻžāĻĒ āĻŦāĻžāχāϰ⧇ āĻ—āĻŋāϝāĻŧ⧇ count āĻĒāĻžāϝāĻŧāĨ¤
56next() call 1shop: next() call 1, makeCounter() call 1, file, āĻĒāĻžāĻ“āϝāĻŧāĻž āϗ⧇āϞshop āφāϛ⧇ āĻĻ⧁āχ āϧāĻžāĻĒ āĻŦāĻžāχāϰ⧇: āĻ–ā§‹āρāϜāĻž āϚāϞ⧇ next-āĻ, āϤāĻžāϰāĻĒāϰ makeCounter-āĻāϰ call-āĻ, āϤāĻžāϰāĻĒāϰ file-āĻāĨ¤
610fileāύ⧇āχCall-āϟāĻž Progsity Books #1 print āĻ•āϰ⧇ āĻļ⧇āώāĨ¤ makeCounter-āĻāϰ scope count-āϕ⧇ 1-āĻ āϧāϰ⧇ āϰ⧇āϖ⧇āϛ⧇āĨ¤
75next() call 2count: next() call 2, makeCounter() call 1, āĻĒāĻžāĻ“āϝāĻŧāĻž āϗ⧇āϞāĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ call āύāĻŋāĻœā§‡āϰ āĻāĻ•āϟāĻž āύāϤ⧁āύ scope āĻĒāĻžāϝāĻŧ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϖ⧁āρāĻœā§‡ āĻĒāĻžāϝāĻŧ āϏ⧇āχ āĻāĻ•āχ count, āĻāĻ–āύ 2āĨ¤
811fileāύ⧇āχPrint āĻšāϞ⧋ Progsity Books #2āĨ¤ āĻĻ⧁āχ call-āĻāϰ āĻŽāĻžāĻāĻ–āĻžāύ⧇ count āĻšāĻžāϰāĻŋāϝāĻŧ⧇ āϝāĻžāϝāĻŧāύāĻŋāĨ¤
912filecount: file, ReferenceError: count is not definedFile count āĻ–ā§‹āρāĻœā§‡ āĻļ⧁āϧ⧁ āύāĻŋāĻœā§‡āϰ scope-āĻāĨ¤ āĻ–ā§‹āρāϜāĻž āĻ•āĻ–āύ⧋ āϭ⧇āϤāϰ⧇āϰ āĻĻāĻŋāϕ⧇ āϝāĻžāϝāĻŧ āύāĻž, āϤāĻžāχ count privateāĨ¤

āĻāχ āϏ⧇āχ program, āϚāĻžāϞāĻžāύ⧋ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧāĨ¤

const shop = "Progsity Books";
function makeCounter() {
  let count = 0;
  return function next() {
    count++;
    return shop + " #" + count;
  };
}
const ticket = makeCounter();
console.log(ticket());
console.log(ticket());
console.log(count);
Progsity Books #1
Progsity Books #2
ReferenceError: count is not defined

āĻāĻ–āĻžāύ āĻĨ⧇āϕ⧇ āϤāĻŋāύāϟāĻž āĻ•āĻĨāĻž āĻŦ⧇āϰ āĻšāϝāĻŧāĨ¤ count āĻĨāĻžāϕ⧇ makeCounter call-āĻāϰ āĻŦāĻžāĻ•ā§āϏ⧇, āϤāĻžāχ ticket-āĻāϰ āĻāĻ• call āĻĨ⧇āϕ⧇ āĻĒāϰ⧇āϰ call āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϟāĻŋāϕ⧇ āĻĨāĻžāϕ⧇āĨ¤ File count āĻĒāĻĄāĻŧāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻž, āϤāĻžāχ āĻ…āĻ¨ā§āϝ āϕ⧋āύ⧋ code āĻ“āϟāĻž reset āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻžāĨ¤ āφāϰ let count = 0 āϚāϞ⧇āϛ⧇ āĻāĻ•āĻŦāĻžāϰ, makeCounter call āĻšāĻ“āϝāĻŧāĻžāϰ āϏāĻŽāϝāĻŧ, āĻĒā§āϰāϤāĻŋāϟāĻž ticket-āĻ āύāĻžāĨ¤ āĻŽāĻžāύ⧇ closure āĻšāϞ⧋ āĻāĻ•āϟāĻž private variable, āϝ⧇āϟāĻž āϤāϤāĻĻāĻŋāύ āĻŦāĻžāρāĻšā§‡ āϝāϤāĻĻāĻŋāύ āĻ“āϕ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž function-āϟāĻž āĻŦāĻžāρāĻšā§‡āĨ¤

āĻĻ⧁āĻŸā§‹ call, āĻĻ⧁āĻŸā§‹ counter

makeCounter-āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻž call āĻāĻ•āϟāĻž āύāϤ⧁āύ count āύāĻŋāϝāĻŧ⧇ āĻāĻ•āϟāĻž āύāϤ⧁āύ āĻŦāĻžāĻ•ā§āϏ āĻŦāĻžāύāĻžāϝāĻŧāĨ¤ āϤāĻžāχ āĻāĻ•āχ factory āĻĨ⧇āϕ⧇ āĻŦāĻžāύāĻžāύ⧋ āĻĻ⧁āĻŸā§‹ counter āĻ•āĻ–āύ⧋ āĻāĻ•āϟāĻž count āĻ­āĻžāĻ— āĻ•āϰ⧇ āύāĻž, āφāϰ Kenji āφāϰ Bob āĻĻ⧁āϜāύ⧇āχ āύāĻŋāĻœā§‡āϰ āύāĻŋāĻœā§‡āϰ counter āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

makeCounter-āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻž call āύāĻŋāĻœā§‡āϰ count āύāĻŋāϝāĻŧ⧇ āύāĻŋāĻœā§‡āϰ āĻāĻ•āϟāĻž scope āĻŦāĻžāύāĻžāϝāĻŧāĨ¤ tea āϧāϰ⧇ āϰ⧇āϖ⧇āϛ⧇ āĻĒā§āϰāĻĨāĻŽāϟāĻžāϕ⧇, coffee āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧāϟāĻžāϕ⧇, āϤāĻžāχ tea āĻĻ⧁āĻŦāĻžāϰ call āĻšāϞ⧇āĻ“ coffee-āϰ count āĻĨāĻžāϕ⧇ 0, āφāϰ coffee call āĻšāϞ⧇ āύāĻĄāĻŧ⧇ āĻļ⧁āϧ⧁ āĻ“āϰ āύāĻŋāĻœā§‡āϰāϟāĻžāĨ¤

āϧāĻžāĻĒāϞāĻžāχāύāϝ⧇ scope āϚāϞāϛ⧇āĻ–ā§‹āρāϜāĻžāϕ⧀ āĻšāϞ⧋
15fileāύ⧇āχāĻĒā§āϰāĻĨāĻŽ call āύāĻŋāĻœā§‡āϰ count āύāĻŋāϝāĻŧ⧇ āĻāĻ•āϟāĻž scope āĻŦāĻžāύāĻŋāϝāĻŧ⧇āϛ⧇, āφāϰ tea āĻ“āϟāĻžāϕ⧇ āϧāϰ⧇ āϰ⧇āϖ⧇āϛ⧇āĨ¤
26fileāύ⧇āχāĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ call āĻŦāĻžāύāĻžāϞ āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ āĻāĻ•āϟāĻž scope, āϤāĻžāϤ⧇ āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ āĻāĻ•āϟāĻž countāĨ¤ coffee āϧāϰ⧇ āϰ⧇āϖ⧇āϛ⧇ āĻāϟāĻžāϕ⧇āĨ¤
37tea() call 1count: tea() call 1, makeCounter() call 1, āĻĒāĻžāĻ“āϝāĻŧāĻž āϗ⧇āϞtea-āϰ āĻ–ā§‹āρāϜāĻž āĻĒ⧌āρāĻ›āĻžāϝāĻŧ call 1-āĻāϰ count-āĻ, āϝ⧇āĻ–āĻžāύ⧇ tea āϤ⧈āϰāĻŋ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āφāϰ 1 āϝ⧋āĻ— āĻ•āϰ⧇āĨ¤
48tea() call 2count: tea() call 2, makeCounter() call 1, āĻĒāĻžāĻ“āϝāĻŧāĻž āϗ⧇āϞtea-āϰ count āĻāĻ–āύ 2āĨ¤ coffee-āϰ count āĻāĻ•āϟ⧁āĻ“ āύāĻĄāĻŧ⧇āύāĻŋāĨ¤
59coffee() call 1count: coffee() call 1, makeCounter() call 2, āĻĒāĻžāĻ“āϝāĻŧāĻž āϗ⧇āϞcoffee-āϰ āĻ–ā§‹āρāϜāĻž āĻĒ⧌āρāĻ›āĻžāϝāĻŧ call 2-āĻāϰ count-āĻāĨ¤ āĻĻ⧁āĻŸā§‹ call, āĻĻ⧁āĻŸā§‹ scope, āĻĻ⧁āĻŸā§‹ countāĨ¤

āĻŽāĻžāύ⧇ factory āϞ⧇āĻ–āĻž āĻšāϝāĻŧ āĻāĻ•āĻŦāĻžāϰ, āφāϰ āĻĒā§āϰāϤāĻŋāϟāĻž counter-āĻāϰ āϜāĻ¨ā§āϝ call āĻšāϝāĻŧ āĻāĻ•āĻŦāĻžāϰ āĻ•āϰ⧇āĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž call āĻāĻŽāύ āĻāĻ•āϟāĻž function āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧ, āϝ⧇āϟāĻž āύāĻŋāĻœā§‡āϰ āĻŦāĻžāĻ•ā§āϏāϟāĻž āĻŽāύ⧇ āϰāĻžāϖ⧇āĨ¤

āϤāĻŋāύ āϰāĻ•āĻŽ scope, āφāϰ counter factory

const a = 1;              // file-āĻāϰ scope: āύāĻŋāĻšā§‡āϰ āĻĒā§āϰāϤāĻŋāϟāĻž āϞāĻžāχāύ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϝāĻŧ

function outer(p) {       // outer-āĻāϰ scope: p āφāϰ b, āĻĒā§āϰāϤāĻŋāϟāĻž call-āĻ āύāϤ⧁āύ āĻ•āϰ⧇
  const b = 2;
  if (b > 1) {
    const c = 3;          // āĻāĻ•āϟāĻž block-āĻāϰ scope: c āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧ āĻļ⧁āϧ⧁ āĻāχ brace āĻĻ⧁āĻŸā§‹āϰ āϭ⧇āϤāϰ⧇
  }
}

function makeCounter() {  // factory
  let count = 0;          // private variable, makeCounter-āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻž call-āĻ āĻāĻ•āϟāĻž
  return function () {    // āϭ⧇āϤāϰ⧇āϰ function, āϝ⧇āϟāĻž āĻāχ call-āĻāϰ scope āĻŽāύ⧇ āϰāĻžāϖ⧇
    count++;
    return count;
  };
}
const next = makeCounter(); // closure: āĻāϟāĻžāϕ⧇ call āĻ•āϰ⧋, count āĻāĻ• call āĻĨ⧇āϕ⧇ āĻĒāϰ⧇āϰ call-āĻ āϟāĻŋāϕ⧇ āĻĨāĻžāϕ⧇
  • āĻ–ā§‹āρāϜāĻž āĻļ⧁āϰ⧁ āĻšāϝāĻŧ āϝ⧇ āϞāĻžāχāύ āϚāϞāϛ⧇ āϤāĻžāϰ scope āĻĨ⧇āϕ⧇, āϤāĻžāϰāĻĒāϰ āĻŦāĻžāχāϰ⧇āϰ āĻĻāĻŋāϕ⧇ āϝāĻžāϝāĻŧ; āϭ⧇āϤāϰ⧇āϰ āĻĻāĻŋāϕ⧇ āĻ•āĻ–āύ⧋ āϝāĻžāϝāĻŧ āύāĻžāĨ¤
  • let āφāϰ const āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻ•āĻžāϛ⧇āϰ brace-āĻāϰ; parameter āφāϰ function-āĻāϰ āϭ⧇āϤāϰ⧇ declare āĻ•āϰāĻž āύāĻžāĻŽ āĻ“āχ function-āĻāϰāĨ¤
  • Function-āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻž call āϏ⧇āχ call-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻž āύāϤ⧁āύ scope āĻŦāĻžāύāĻžāϝāĻŧāĨ¤
  • āϭ⧇āϤāϰ⧇āϰ function āϝ⧇ scope-āĻ āϤ⧈āϰāĻŋ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ āϏ⧇āϟāĻž āϧāϰ⧇ āϰāĻžāϖ⧇, āϝāϤāĻĻāĻŋāύ āϭ⧇āϤāϰ⧇āϰ function-āϟāĻžāϕ⧇ āύāĻŋāĻœā§‡ āϕ⧋āĻĨāĻžāĻ“ āĻĨ⧇āϕ⧇ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧāĨ¤
Example 1: āĻāĻ•āϟāĻž block āύāĻŋāĻœā§‡āϰ āύāĻžāĻŽ āύāĻŋāĻœā§‡āϰ āĻ•āĻžāϛ⧇ āϰāĻžāϖ⧇

āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϛ⧋āϟ scope: āĻāĻ•āϟāĻž if block-āĻāϰ āϭ⧇āϤāϰ⧇ āĻāĻ•āϟāĻž constāĨ¤

const price = 450;
if (price > 400) {
  const discount = 45;
  console.log("pay " + (price - discount));
}
console.log("listed at " + price);
pay 405
listed at 450

discount āφāϛ⧇ āĻļ⧁āϧ⧁ brace āĻĻ⧁āĻŸā§‹āϰ āĻŽāĻžāĻāĻ–āĻžāύ⧇, āφāϰ file-āĻāϰ price āĻĻ⧁āχ āϜāĻžāϝāĻŧāĻ—āĻž āĻĨ⧇āϕ⧇āχ āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧāĨ¤ āĻļ⧇āώ āϞāĻžāχāύ āĻšāĻŋāϏ⧇āĻŦ⧇ console.log(discount) āϝ⧋āĻ— āĻ•āϰ⧋, program āĻĨ⧇āĻŽā§‡ āϝāĻžāĻŦ⧇ ReferenceError: discount is not defined āĻĻāĻŋāϝāĻŧ⧇āĨ¤

Run in Compiler
Example 2: āĻāĻ•āϟāĻž function-āĻāϰ āύāĻŋāĻœā§‡āϰ āύāĻžāĻŽ

Parameter āφāϰ function-āĻāϰ āϭ⧇āϤāϰ⧇ declare āĻ•āϰāĻž āύāĻžāĻŽ āĻĨāĻžāϕ⧇ āĻ“āϰ āĻŦāĻžāĻ•ā§āϏ⧇, āϤāĻžāχ āĻĻ⧁āĻŸā§‹ function āĻāĻ•āχ āύāĻžāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇āĻ“ āϧāĻžāĻ•ā§āĻ•āĻž āϞāĻžāϗ⧇ āύāĻžāĨ¤

function receipt(item, price) {
  const total = price + price * 0.05;
  return item + ": " + total;
}
function stock(item, count) {
  const total = count * 12;
  return item + ": " + total + " pieces";
}
console.log(receipt("pen", 20));
console.log(stock("pen", 3));
console.log(typeof total);
pen: 21
pen: 36 pieces
undefined

āĻĒā§āϰāϤāĻŋāϟāĻž function-āĻāϰ āύāĻŋāĻœā§‡āϰ total āφāϛ⧇, āύāĻŋāĻœā§‡āϰ āĻŦāĻžāĻ•ā§āϏ⧇, āφāϰ āϕ⧋āύ⧋āϟāĻžāχ file-āĻ āϚ⧁āχāϝāĻŧ⧇ āĻĒāĻĄāĻŧ⧇ āύāĻžāĨ¤ āĻāϜāĻ¨ā§āϝāχ āĻāĻ•āϟāĻž āύāĻžāĻŽ declare āĻ•āϰāĻŦ⧇ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϛ⧋āϟ āϝ⧇ āĻŦāĻžāĻ•ā§āϏ⧇ āĻ“āϟāĻž āϞāĻžāϗ⧇, āϏ⧇āĻ–āĻžāύ⧇āĨ¤

Run in Compiler
Example 3: Kenji-āϰ counter, āϏāĻžāϰāĻžāύ⧋

āϝ⧇ program-āϟāĻž Kenji āφāϏāϞ⧇ āϰ⧇āϖ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āĻāĻ•āχ factory āĻĨ⧇āϕ⧇ āĻĒā§āϰāϤāĻŋāϟāĻž feature āύāĻŋāĻœā§‡āϰ counter āĻĒāĻžāϝāĻŧ, āφāϰ reset āϛ⧋āρāϝāĻŧ āĻļ⧁āϧ⧁ like-āϗ⧁āϞ⧋āĨ¤

function makeCounter() {
  let count = 0;
  return {
    add: () => ++count,
    reset: () => {
      count = 0;
    },
    read: () => count,
  };
}

const views = makeCounter();
const likes = makeCounter();
views.add();
views.add();
likes.add();
views.add();
likes.reset();
views.add();
console.log("views: " + views.read());
console.log("likes: " + likes.read());
views: 4
likes: 0

Factory āϤāĻŋāύāϟāĻž āϛ⧋āϟ function āĻāĻ•āϟāĻž object-āĻ āĻ­āϰ⧇ āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧ (object Module 8-āĻāϰ āĻŦāĻŋāώāϝāĻŧ; āĻāĻ–āĻžāύ⧇ āĻāϟāĻž āĻļ⧁āϧ⧁ brace-āĻāϰ āϭ⧇āϤāϰ⧇ āϤāĻŋāύāϟāĻž āύāĻžāĻŽ)āĨ¤ āϤāĻŋāύāϟāĻžāχ āϤ⧈āϰāĻŋ āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻ•āχ call-āĻ, āϤāĻžāχ āϤāĻŋāύāϟāĻžāχ āĻ“āχ call-āĻāϰ āĻāĻ•āχ count āĻ­āĻžāĻ— āĻ•āϰ⧇ āύ⧇āϝāĻŧāĨ¤ views āφāϰ likes āĻāϏ⧇āϛ⧇ āĻĻ⧁āĻŸā§‹ call āĻĨ⧇āϕ⧇, āϤāĻžāχ āĻ“āĻĻ⧇āϰ count āĻĻ⧁āĻŸā§‹, āφāϰ āĻāĻ•āϟāĻžāϰ reset āĻ…āĻ¨ā§āϝāϟāĻžāϕ⧇ āϛ⧁āρāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻžāĨ¤

Run in Compiler

āĻāϟāĻž āϕ⧋āĻĨāĻžāϝāĻŧ āĻ•āĻžāĻœā§‡ āϞāĻžāϗ⧇

  • ReactāĨ¤ āĻāĻ•āϟāĻž React component āφāϏāϞ⧇ āĻāĻ•āϟāĻž function, āφāϰ āĻ“āϰ useState hook āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧ state āφāϰ āĻāĻ•āϟāĻž setterāĨ¤ Component-āĻāϰ āϭ⧇āϤāϰ⧇ āϞ⧇āĻ–āĻž click handler-āϗ⧁āϞ⧋ closure, āϝ⧇ render āĻ“āĻĻ⧇āϰ āĻŦāĻžāύāĻŋāϝāĻŧ⧇āϛ⧇ āϤāĻžāϰ value-āϗ⧁āϞ⧋āϰ āĻ“āĻĒāϰ (āϕ⧋āĻĨāĻžāϝāĻŧ āĻāϟāĻž āĻ•āĻžāĻŽāĻĄāĻŧ āĻĻ⧇āϝāĻŧ, lesson 04 āĻĻ⧇āĻ–āĻžāĻŦ⧇)āĨ¤
  • ExpressāĨ¤ express.static(root) āĻāĻ•āϟāĻž folder āĻĨ⧇āϕ⧇ file serve āĻ•āϰ⧇āĨ¤ āĻāϟāĻž āĻāĻ•āϟāĻž middleware function āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧ, āϝ⧇āϟāĻž root āφāϰ āĻ“āϰ option-āϗ⧁āϞ⧋ āĻāĻ•āϟāĻž closure-āĻ āĻŽāύ⧇ āϰāĻžāϖ⧇, āφāϰ āĻĒā§āϰāϤāĻŋāϟāĻž request-āĻ āϏ⧇āϗ⧁āϞ⧋ āĻ•āĻžāĻœā§‡ āϞāĻžāĻ—āĻžāϝāĻŧāĨ¤
  • lodashāĨ¤ āĻāϰ once āφāϰ debounce āϤ⧋āĻŽāĻžāϰ function-āϕ⧇ āĻāĻ•āϟāĻž āύāϤ⧁āύ function-āĻ āĻŽā§āĻĄāĻŧ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āĻŽā§‹āĻĄāĻŧāĻ•āϟāĻž āĻāĻ• call āĻĨ⧇āϕ⧇ āĻĒāϰ⧇āϰ call āĻĒāĻ°ā§āϝāĻ¨ā§āϤ private state āϰāĻžāϖ⧇, āĻāĻ•āϟāĻžāϝāĻŧ call-āĻāϰ āĻšāĻŋāϏāĻžāĻŦ, āĻ…āĻ¨ā§āϝāϟāĻžāϝāĻŧ āĻ…āĻĒ⧇āĻ•ā§āώāĻžāϝāĻŧ āĻĨāĻžāĻ•āĻž āĻāĻ•āϟāĻž timer (lesson 03 āφāϰ 06 āĻĻ⧁āĻŸā§‹āχ āĻŦāĻžāύāĻžāĻŦ⧇)āĨ¤
  • āĻ–ā§‹āĻĻ NodeāĨ¤ Node āĻĒā§āϰāϤāĻŋāϟāĻž CommonJS file āϚāĻžāϞāĻžāϝāĻŧ āĻāĻ•āϟāĻž function-āĻāϰ āϭ⧇āϤāϰ⧇, āĻ“āĻĻ⧇āϰ documentation-āĻ āϝ⧇āϟāĻžāϰ āύāĻžāĻŽ "module wrapper"āĨ¤ āĻāϜāĻ¨ā§āϝāχ āĻāĻ•āϟāĻž file-āĻāϰ āĻŦāĻžāχāϰ⧇āϰ āĻ¸ā§āϤāϰ⧇āϰ āύāĻžāĻŽāϗ⧁āϞ⧋ āĻ“āχ file-āĻāϰ āϭ⧇āϤāϰ⧇āχ private āĻĨāĻžāϕ⧇ (Module 11)āĨ¤

āϝ⧇ āϭ⧁āϞāϗ⧁āϞ⧋ āϏāĻŦāĻžāχ āĻ•āϰ⧇

ā§§. Block āĻŦāĻ¨ā§āϧ āĻšāĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇ āĻāĻ•āϟāĻž āύāĻžāĻŽ āĻĒāĻĄāĻŧāĻžāĨ¤

const marks = 72;
if (marks >= 40) {
  let result = "pass";
}
console.log(result);
ReferenceError: result is not defined

result āĻĨāĻžāĻ•āϤ if block-āĻ, āφāϰ āĻļ⧇āώ āϞāĻžāχāύāϟāĻž āϤāĻžāϰ āĻŦāĻžāχāϰ⧇āĨ¤ Block-āĻāϰ āφāϗ⧇ let result; āĻĻāĻŋāϝāĻŧ⧇ declare āĻ•āϰ⧋, āφāϰ value āĻŦāϏāĻžāĻ“ āϭ⧇āϤāϰ⧇āĨ¤ āĻāχ āϭ⧁āϞāϟāĻž āĻ•āϰāĻŦ⧇, āĻ•āĻžāϰāĻŖ block-āĻāϰ āĻļ⧇āώ brace-āϟāĻžāϕ⧇ āĻĻ⧇āϝāĻŧāĻžāϞ āĻŽāύ⧇ āĻšāϝāĻŧ āύāĻž, āĻŽāύ⧇ āĻšāϝāĻŧ āĻāĻ•āϟāĻž āϝāϤāĻŋāϚāĻŋāĻšā§āύāĨ¤

⧍. Factory āϭ⧇āϤāϰ⧇āϰ function-āϟāĻž return āĻ•āϰāϤ⧇ āϭ⧁āϞ⧇ āϗ⧇āϛ⧇āĨ¤

function makeCounter() {
  let count = 0;
  function next() {
    count++;
    return count;
  }
}
const ticket = makeCounter();
console.log(ticket());
TypeError: ticket is not a function

makeCounter next āĻŦāĻžāύāĻŋāϝāĻŧ⧇āϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ•āĻŋāϛ⧁āχ return āĻ•āϰ⧇āύāĻŋ, āϤāĻžāχ ticket āĻšāϞ⧋ undefinedāĨ¤ return next; āϝ⧋āĻ— āĻ•āϰ⧋āĨ¤ āϭ⧁āϞ⧇ āϝāĻžāĻŦ⧇, āĻ•āĻžāϰāĻŖ āϭ⧇āϤāϰ⧇āϰ function āϞ⧇āĻ–āĻž āĻļ⧇āώ āĻšāϞ⧇āχ āĻŽāύ⧇ āĻšāϝāĻŧ āĻ•āĻžāϜ āĻļ⧇āώāĨ¤

ā§Š. āĻĻ⧁āĻŸā§‹ counter āĻāĻ•āϟāĻžāχ count āĻ­āĻžāĻ— āĻ•āϰāϛ⧇āĨ¤

let count = 0;
function makeCounter() {
  return () => ++count;
}
const tea = makeCounter();
const coffee = makeCounter();
tea();
tea();
console.log("coffee " + coffee());
coffee 3

āϕ⧋āύ⧋ error āύ⧇āχ, āωāĻ¤ā§āϤāϰāϟāĻž āϭ⧁āϞāĨ¤ count āĻĨāĻžāϕ⧇ file-āĻ, āϤāĻžāχ āĻĻ⧁āĻŸā§‹ function-āχ āĻāĻ•āχ count āϖ⧁āρāĻœā§‡ āĻĒāĻžāϝāĻŧāĨ¤ let count = 0; āϏāϰāĻŋāϝāĻŧ⧇ āφāύ⧋ makeCounter-āĻāϰ āϭ⧇āϤāϰ⧇, āϝāĻžāϤ⧇ āĻĒā§āϰāϤāĻŋāϟāĻž call āύāĻŋāĻœā§‡āϰāϟāĻž āĻŦāĻžāύāĻžāϝāĻŧāĨ¤ āĻāϟāĻž āĻ•āϰāĻŦ⧇, āĻ•āĻžāϰāĻŖ counter-āĻāϰ āĻĒā§āϰāĻĨāĻŽ version āϏāĻŦāϏāĻŽāϝāĻŧ āϞ⧇āĻ–āĻž āĻšāϝāĻŧ file-āĻāϰ āĻāĻ•āĻĻāĻŽ āĻ“āĻĒāϰ⧇āĨ¤

ā§Ē. āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ factory call āĻ•āϰāĻžāĨ¤

function makeCounter() {
  let count = 0;
  return () => ++count;
}
console.log(makeCounter()());
console.log(makeCounter()());
1
1

āĻĒā§āϰāϤāĻŋāϟāĻž makeCounter() 0 āĻĨ⧇āϕ⧇ āĻļ⧁āϰ⧁ āĻšāĻ“āϝāĻŧāĻž āύāϤ⧁āύ āĻāĻ•āϟāĻž count āύāĻŋāϝāĻŧ⧇ āύāϤ⧁āύ āĻŦāĻžāĻ•ā§āϏ āĻŦāĻžāύāĻžāϝāĻŧ, āϤāĻžāχ count āĻ•āĻ–āύ⧋ āĻŦāĻžāĻĄāĻŧ⧇ āύāĻžāĨ¤ Factory call āĻ•āϰ⧋ āĻāĻ•āĻŦāĻžāϰ, āϝ⧇ function āĻĢ⧇āϰāϤ āφāϏ⧇ āϏ⧇āϟāĻž āĻāĻ•āϟāĻž const-āĻ āϰāĻžāĻ–ā§‹, āφāϰ call āĻ•āϰ⧋ āϏ⧇āϟāĻžāϕ⧇āĨ¤ āĻāϟāĻž āϞāĻŋāĻ–āĻŦ⧇, āϝāĻ–āύ āĻĻ⧁āχ āĻœā§‹āĻĄāĻŧāĻž bracket āĻĻ⧇āϖ⧇ āĻāĻ•āϟāĻžāχ call āĻŽāύ⧇ āĻšāĻŦ⧇āĨ¤

āĻŽāĻžāĻĨāĻž āĻ–āĻžāϟāĻžāĻ“

Bob āĻŦāϞāϛ⧇ āĻāϟāĻž print āĻ•āϰāĻŦ⧇ 10 10 10, āĻ•āĻžāϰāĻŖ āĻĒā§āϰāϤāĻŋāϟāĻž counter 0 āĻĨ⧇āϕ⧇ āĻļ⧁āϰ⧁ āĻšāϝāĻŧāĨ¤

function makeCounter() {
  let count = 0;
  return () => (count += 10);
}
const a = makeCounter();
const b = a;
const c = makeCounter();
console.log(a(), b(), c());

āφāϏāϞ⧇ āϕ⧀ print āĻšāϝāĻŧ, āφāϰ āϕ⧇āύ?

makeCounter āĻ•āϤāĻŦāĻžāϰ call āĻšāϝāĻŧ⧇āϛ⧇ āϗ⧁āύ⧇ āĻĻ⧇āĻ–ā§‹āĨ¤ āϤāĻžāϰāĻĒāϰ āϜāĻŋāĻœā§āĻžā§‡āϏ āĻ•āϰ⧋, a, b āφāϰ c āĻĒā§āϰāĻ¤ā§āϝ⧇āϕ⧇ āϕ⧋āύ āĻŦāĻžāĻ•ā§āϏāϟāĻž āϧāϰ⧇ āφāϛ⧇āĨ¤

āĻ…āύ⧁āĻļā§€āϞāύ ā§§āϏāĻšāϜ

Amara āĻĒā§āϰāϤāĻŋāĻĻāĻŋāύ āĻ•āϤ āĻŽāĻŋāύāĻŋāϟ āĻĒāĻĄāĻŧ⧇, āϞāĻŋāϖ⧇ āϰāĻžāϖ⧇āĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž āĻĻāĻŋāύ⧇āϰ āĻĒāϰ⧇ āĻ“āϰ app āĻĻ⧇āĻ–āĻžāϝāĻŧ āĻāĻ–āύ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āĻ—āĻĄāĻŧ āĻ•āϤāĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž āĻĻāĻŋāύ⧇āϰ āĻĒāϰ⧇ āϏ⧇āχ āĻ—āĻĄāĻŧāϟāĻž print āĻ•āϰ⧋āĨ¤

Input. āĻĒā§āϰāĻĨāĻŽ āϞāĻžāχāύ⧇ nāĨ¤ āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ āϞāĻžāχāύ⧇ n-āϟāĻž āĻĒā§‚āĻ°ā§āĻŖāϏāĻ‚āĻ–ā§āϝāĻž, āĻĒā§āϰāϤāĻŋāϟāĻž āĻĻāĻŋāύ⧇āϰ āĻŽāĻŋāύāĻŋāϟāĨ¤

Output. n-āϟāĻž āϞāĻžāχāύ: i āύāĻŽā§āĻŦāϰ āϞāĻžāχāύ⧇ āĻĒā§āϰāĻĨāĻŽ i-āϟāĻž āϏāĻ‚āĻ–ā§āϝāĻžāϰ āĻ—āĻĄāĻŧ, JavaScript āϝ⧇āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻž āϏāĻ‚āĻ–ā§āϝāĻž print āĻ•āϰ⧇ āϏ⧇āĻ­āĻžāĻŦ⧇āĨ¤

Constraints. 1 <= n <= 100000āĨ¤ 0 <= āĻĒā§āϰāϤāĻŋāϟāĻž āϏāĻ‚āĻ–ā§āϝāĻž <= 1000āĨ¤

Sample. Input 4 āφāϰ 30 45 0 60 āĻĻāĻŋāϞ⧇ āϚāĻžāϰ āϞāĻžāχāύ⧇ āφāϏ⧇ 30, 37.5, 25 āφāϰ 33.75āĨ¤

const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];

// your code: read with next() and nextInt(), push every line of output to out

console.log(out.join("\n"));

running-average āύāĻžāĻŽā§‡ grade āĻšāϝāĻŧāĨ¤ Hidden test-āĻ āφāϛ⧇ n = 1, 0 āĻŽāĻŋāύāĻŋāĻŸā§‡āϰ āĻĻāĻŋāύ, āφāϰ āĻāĻŽāύ āĻ—āĻĄāĻŧ āϝ⧇āϟāĻž āĻĒā§‚āĻ°ā§āĻŖāϏāĻ‚āĻ–ā§āϝāĻž āύāĻžāĨ¤

Run in Compiler
āĻ…āύ⧁āĻļā§€āϞāύ ⧍āϏāĻšāϜ

Kenji-āϰ gym-āĻ k-āϟāĻž turnstile, āĻĒā§āϰāĻ¤ā§āϝ⧇āĻ•āϟāĻžāϰ āύāĻŋāĻœā§‡āϰ counterāĨ¤ Command āφāϏ⧇ āĻāĻ• āϞāĻžāχāύ⧇ āĻāĻ•āϟāĻž āĻ•āϰ⧇āĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž get-āĻāϰ āωāĻ¤ā§āϤāϰ āĻĻāĻžāĻ“āĨ¤

Input. āĻĒā§āϰāĻĨāĻŽ āϞāĻžāχāύ⧇ k āφāϰ qāĨ¤ āϤāĻžāϰāĻĒāϰ q-āϟāĻž command: inc i, dec i, reset i āĻŦāĻž get i, āϝ⧇āĻ–āĻžāύ⧇ 1 <= i <= kāĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž counter āĻļ⧁āϰ⧁ āĻšāϝāĻŧ 0 āĻĨ⧇āϕ⧇āĨ¤ inc 1 āϝ⧋āĻ— āĻ•āϰ⧇āĨ¤ dec 1 āĻŦāĻŋāϝāĻŧā§‹āĻ— āĻ•āϰ⧇, āϤāĻŦ⧇ 0-āϤ⧇ āĻĨāĻžāĻ•āĻž counter 0-āϤ⧇āχ āĻĨāĻžāϕ⧇āĨ¤ reset āĻ“āϟāĻžāϕ⧇ 0 āĻ•āϰ⧇ āĻĻ⧇āϝāĻŧāĨ¤

Output. āĻĒā§āϰāϤāĻŋāϟāĻž get-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ• āϞāĻžāχāύ: āĻ“āχ counter-āĻāϰ valueāĨ¤

Constraints. 1 <= k <= 1000āĨ¤ 1 <= q <= 100000āĨ¤ āĻ…āĻ¨ā§āϤāϤ āĻāĻ•āϟāĻž get āĻĨāĻžāĻ•āĻŦ⧇āχāĨ¤

Sample. Input 2 9, āϤāĻžāϰāĻĒāϰ inc 1, inc 1, inc 2, dec 2, dec 2, get 1, get 2, reset 1, get 1 āĻĻāĻŋāϞ⧇ āϤāĻŋāύ āϞāĻžāχāύ⧇ āφāϏ⧇ 2, 0 āφāϰ 0āĨ¤

const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];

// your code: read with next() and nextInt(), push every line of output to out

console.log(out.join("\n"));

many-counters āύāĻžāĻŽā§‡ grade āĻšāϝāĻŧāĨ¤ Hidden test-āĻ āφāϛ⧇ 0-āϤ⧇ āĻĨāĻžāĻ•āĻž counter-āĻ dec, āφāϰ āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻž turnstileāĨ¤

Run in Compiler
āĻ…āύ⧁āĻļā§€āϞāύ ā§ŠāĻŽāĻžāĻāĻžāϰāĻŋ

Zara āĻĒā§āϰāϤāĻŋ āϘāĻŖā§āϟāĻžāϝāĻŧ āϤāĻžāĻĒāĻŽāĻžāĻ¤ā§āϰāĻž āϞāĻŋāϖ⧇ āϰāĻžāϖ⧇, āφāϰ āĻĒā§āϰāϤāĻŋāϟāĻž reading-āĻāϰ āĻĒāϰ⧇ āϚāĻžāϝāĻŧ "āĻāĻ–āύ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϏāĻ°ā§āĻŦā§‹āĻšā§āϚ" āĻāĻ•āϟāĻž āϞāĻžāχāύāĨ¤ āĻāĻ•āϟāĻž factory makeHighest() āϞ⧇āĻ–ā§‹, āϝāĻžāϰ function āĻāĻ•āϟāĻž reading āύ⧇āϝāĻŧ āφāϰ āĻ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āĻĻ⧇āĻ–āĻž āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻŦāĻĄāĻŧ reading āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧ, āϤāĻžāϰāĻĒāϰ input-āĻāϰ āĻ“āĻĒāϰ āĻ“āϟāĻž āϚāĻžāϞāĻžāĻ“āĨ¤

Input. n, āϤāĻžāϰāĻĒāϰ n-āϟāĻž āĻĒā§‚āĻ°ā§āĻŖāϏāĻ‚āĻ–ā§āϝāĻž, reading-āϗ⧁āϞ⧋āĨ¤

Output. n-āϟāĻž āϞāĻžāχāύ: āĻĒā§āϰāĻĨāĻŽ i-āϟāĻž reading-āĻāϰ āĻŽāĻ§ā§āϝ⧇ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻŦāĻĄāĻŧāϟāĻžāĨ¤

Constraints. 1 <= n <= 100000āĨ¤ -50 <= āĻĒā§āϰāϤāĻŋāϟāĻž reading <= 60āĨ¤

Sample. Input 5 āφāϰ -3 -7 2 1 9 āĻĻāĻŋāϞ⧇ āĻĒāĻžāρāϚ āϞāĻžāχāύ⧇ āφāϏ⧇ -3, -3, 2, 2 āφāϰ 9āĨ¤

const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];

// your code: read with next() and nextInt(), push every line of output to out

console.log(out.join("\n"));

āφāϞāĻžāĻĻāĻž āĻ•āϰ⧇ grade āĻšāϝāĻŧ āύāĻžāĨ¤ Private variable-āϟāĻž āϕ⧀ āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āĻšāĻŦ⧇, āĻ āĻŋāĻ• āĻ•āϰ⧋āĨ¤ āϤāĻžāϰāĻĒāϰ āĻāĻŽāύ āĻāĻ•āϟāĻž input āĻĻāĻŋāϝāĻŧ⧇ āϚāĻžāϞāĻžāĻ“ āϝ⧇āĻ–āĻžāύ⧇ āĻĒā§āϰāϤāĻŋāϟāĻž reading 0-āϰ āύāĻŋāĻšā§‡āĨ¤

Run in Compiler
āĻ…āύ⧁āĻļā§€āϞāύ ā§ĒāĻ•āĻ āĻŋāύ

David-āĻāϰ drawing app-āĻ āĻāĻ•āϟāĻž size slider āφāϛ⧇, āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻž undo buttonāĨ¤ āĻāĻŽāύ āĻāĻ•āϟāĻž factory āϞ⧇āĻ–ā§‹ āϝāĻžāϰ function-āϗ⧁āϞ⧋ āĻāĻ•āϟāĻž private size āĻŦāĻĻāϞāĻžāϝāĻŧ āφāϰ āĻĒā§āϰāϤāĻŋāϟāĻž āĻŦāĻĻāϞ āĻŽāύ⧇ āϰāĻžāϖ⧇, āϝāĻžāϤ⧇ undo āĻāĻ• āĻāĻ• āĻ•āϰ⧇ āĻĒ⧇āĻ›āύ⧇ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

Input. āĻļ⧁āϰ⧁āϰ size s āφāϰ q, āϤāĻžāϰāĻĒāϰ q-āϟāĻž commandāĨ¤ grow x size-āĻ x āϝ⧋āĻ— āĻ•āϰ⧇, āφāϰ shrink x x āĻŦāĻŋāϝāĻŧā§‹āĻ— āĻ•āϰ⧇āĨ¤ undo āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϏāĻžāĻŽā§āĻĒā§āϰāϤāĻŋāĻ• āϝ⧇ āĻŦāĻĻāϞāϟāĻž āĻāĻ–āύ⧋ undo āĻšāϝāĻŧāύāĻŋ āϏ⧇āϟāĻž āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āύ⧇āϝāĻŧ, āφāϰ āĻāĻŽāύ āĻ•āĻŋāϛ⧁ āύāĻž āĻĨāĻžāĻ•āϞ⧇ āĻ•āĻŋāϛ⧁āχ āĻ•āϰ⧇ āύāĻžāĨ¤ show size print āĻ•āϰ⧇āĨ¤

Output. āĻĒā§āϰāϤāĻŋāϟāĻž show-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ• āϞāĻžāχāύāĨ¤

Constraints. 1 <= q <= 100000āĨ¤ 0 <= s <= 1000āĨ¤ 1 <= x <= 1000āĨ¤ āĻ…āĻ¨ā§āϤāϤ āĻāĻ•āϟāĻž show āĻĨāĻžāĻ•āĻŦ⧇āχāĨ¤

Sample. Input 10 7, āϤāĻžāϰāĻĒāϰ grow 5, shrink 3, show, undo, show, undo, show āĻĻāĻŋāϞ⧇ āφāϏ⧇ 12, 15 āφāϰ 10āĨ¤

const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];

// your code: read with next() and nextInt(), push every line of output to out

console.log(out.join("\n"));

āφāϞāĻžāĻĻāĻž āĻ•āϰ⧇ grade āĻšāϝāĻŧ āύāĻžāĨ¤ āĻŦāĻĻāϞāϗ⧁āϞ⧋ āĻāĻ•āϟāĻž private array-āϤ⧇ āϰāĻžāĻ–ā§‹, āφāϰ āĻļ⧇āώ⧇āϰāϟāĻž āϏāϰāĻžāĻ“ pop() āĻĻāĻŋāϝāĻŧ⧇ (Module 7 āĻāϟāĻž āĻ āĻŋāĻ•āĻŽāϤ⧋ āĻļ⧇āĻ–āĻžāĻŦ⧇)āĨ¤ āϤāĻžāϰāĻĒāϰ āĻŽāĻžāĻ¤ā§āϰ āĻĻ⧁āĻŸā§‹ āĻŦāĻĻāϞ⧇āϰ āĻĒāϰ⧇ āĻĒāϰāĻĒāϰ āϤāĻŋāύāϟāĻž undo āĻĻāĻŋāϝāĻŧ⧇ āϚāĻžāϞāĻžāĻ“āĨ¤

Run in Compiler

āϏāϚāϰāĻžāϚāϰ āϝ⧇ āĻĒā§āϰāĻļā§āύāϗ⧁āϞ⧋ āφāϏ⧇

  • Closure āĻ•āĻŋ āφāĻŽāĻŋ āχāĻšā§āĻ›āĻž āĻ•āϰ⧇ āĻŦāĻžāύāĻžāχ, āύāĻžāĻ•āĻŋ āύāĻŋāĻœā§‡ āĻĨ⧇āϕ⧇āχ āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧ?

    āύāĻŋāĻœā§‡ āĻĨ⧇āϕ⧇āχ āĻšāϝāĻŧāĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž function āĻŽāύ⧇ āϰāĻžāϖ⧇, āĻ“ āϕ⧋āύ scope-āĻ āϤ⧈āϰāĻŋ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ āĻŦā§āϝāĻžāĻĒāĻžāϰāϟāĻž āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻšāϝāĻŧ āϤāĻ–āύāχ, āϝāĻ–āύ function-āϟāĻž āĻ“āϕ⧇ āĻŦāĻžāύāĻžāύ⧋ call-āĻāϰ āĻšā§‡āϝāĻŧ⧇ āĻŦ⧇āĻļāĻŋāĻĻāĻŋāύ āĻŦāĻžāρāĻšā§‡, āϝ⧇āĻŽāύ ticket āĻŦ⧇āρāĻšā§‡āĻ›āĻŋāϞ makeCounter-āĻāϰ āĻĒāϰ⧇āĻ“āĨ¤ āĻŽāĻžāύ⧁āώ āϤāĻ–āύāχ āĻŦāϞ⧇ "closure"āĨ¤

  • Closure āĻ•āĻŋ count-āĻāϰ āĻāĻ•āϟāĻž copy āϰāĻžāϖ⧇, āύāĻžāĻ•āĻŋ āĻ­āĻžāĻ— āĻ•āϰ⧇?

    āĻ­āĻžāĻ— āĻ•āϰ⧇, value-āϰ copy āύāĻž, variable-āϟāĻžāχāĨ¤ āĻāϜāĻ¨ā§āϝāχ count āĻŦāĻžāĻĄāĻŧāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ Example 3-āĻ āĻāĻ•āχ call-āĻ āϤ⧈āϰāĻŋ āϤāĻŋāύāϟāĻž function āĻāĻ•āχ count āĻĻ⧇āϖ⧇, āϤāĻžāχ āĻāĻ•āϟāĻž āĻĻāĻŋāϝāĻŧ⧇ reset āĻ•āϰāϞ⧇ āĻŦāĻžāĻ•āĻŋ āĻĻ⧁āĻŸā§‹āĻ“ āϏ⧇āϟāĻž āĻĻ⧇āϖ⧇āĨ¤

  • ticket-āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻž call-āĻ count āϕ⧇āύ āφāĻŦāĻžāϰ 0 āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧ āύāĻž?

    āĻ•āĻžāϰāĻŖ let count = 0 āφāϛ⧇ makeCounter-āĻ, āϭ⧇āϤāϰ⧇āϰ function-āĻ āύāĻžāĨ¤ āĻ“āϟāĻž āϚāϞ⧇ makeCounter-āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻž call-āĻ āĻāĻ•āĻŦāĻžāϰāĨ¤ ticket call āĻ•āϰāϞ⧇ āϚāϞ⧇ āĻļ⧁āϧ⧁ āϭ⧇āϤāϰ⧇āϰ function-āĻāϰ āĻĻ⧁āĻŸā§‹ āϞāĻžāχāύāĨ¤

  • File-āĻāϰ scope āφāϰ global scope āĻ•āĻŋ āĻāĻ•āχ āϜāĻŋāύāĻŋāϏ?

    Node-āĻāϰ āĻāĻ•āϟāĻž file-āĻ āύāĻžāĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž file-āĻāϰ āύāĻŋāĻœā§‡āϰ āĻŦāĻžāχāϰ⧇āϰ āĻ¸ā§āϤāϰ āφāϛ⧇, āĻāϜāĻ¨ā§āϝāχ āĻāĻ• file-āĻāϰ āύāĻžāĻŽ āφāϰ⧇āĻ• file-āĻ āϚ⧁āχāϝāĻŧ⧇ āϝāĻžāϝāĻŧ āύāĻžāĨ¤ Global object āϕ⧀, āφāϰ āĻāχ track āϕ⧇āύ āĻ•āĻ–āύ⧋ āĻ“āϤ⧇ āϞ⧇āϖ⧇ āύāĻž, lesson 02 āĻĻ⧇āĻ–āĻžāĻŦ⧇āĨ¤

  • Closure āĻ•āĻŋ āĻŦāĻžāχāϰ⧇āϰ āĻĒ⧁āϰ⧋ scope-āϟāĻžāχ memory-āϤ⧇ āϧāϰ⧇ āϰāĻžāϖ⧇?

    āϝāĻž āĻāĻ–āύ⧋ āĻ“āϰ āύāĻžāĻ—āĻžāϞ⧇ āφāϛ⧇, āϏ⧇āϟāĻž āĻŦāĻžāρāϚāĻŋāϝāĻŧ⧇ āϰāĻžāϖ⧇, āϝāϤāĻĻāĻŋāύ closure-āϟāĻžāϕ⧇ āύāĻŋāĻœā§‡ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧāĨ¤ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāϤ⧇ āĻ–āϰāϚ āĻ•āϝāĻŧ⧇āĻ• byteāĨ¤ āϝ⧇āĻ–āĻžāύ⧇ āĻ–āϰāϚ megabyte-āĻ āĻ—āĻŋāϝāĻŧ⧇ āĻĻāĻžāρāĻĄāĻŧāĻžāϝāĻŧ, lesson 05 āϏ⧇āϟāĻž āĻŽā§‡āĻĒ⧇ āĻĻ⧇āĻ–āĻžāĻŦ⧇āĨ¤

āĻŽā§‚āϞ āĻ•āĻĨāĻž

  • Scope āĻšāϞ⧋ program-āĻāϰ āϏ⧇āχ āĻ…āĻ‚āĻļ āϝ⧇āĻ–āĻžāύ⧇ āĻāĻ•āϟāĻž āύāĻžāĻŽ āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧ: file, āĻāĻ•āϟāĻž function, āĻŦāĻž brace-āĻāϰ āϭ⧇āϤāϰ⧇āϰ āĻāĻ•āϟāĻž blockāĨ¤
  • āĻ–ā§‹āρāϜāĻž āĻļ⧁āϰ⧁ āĻšāϝāĻŧ āϝ⧇ scope āϚāϞāϛ⧇ āϏ⧇āĻ–āĻžāύ āĻĨ⧇āϕ⧇, āφāϰ āĻšāĻžāρāĻŸā§‡ āĻŦāĻžāχāϰ⧇āϰ āĻĻāĻŋāϕ⧇; āĻĨāĻžāĻŽā§‡ āĻĒā§āϰāĻĨāĻŽ āĻŽāĻŋāϞ⧇ āϝāĻžāĻ“āϝāĻŧāĻž āύāĻžāĻŽā§‡, āύāϝāĻŧāϤ⧋ file-āĻ āĻĒ⧌āρāϛ⧇ āĻāĻ•āϟāĻž ReferenceError āĻĻāĻŋāϝāĻŧ⧇āĨ¤
  • āĻŦāĻžāχāϰ⧇āϰ scope āĻ•āĻ–āύ⧋ āϭ⧇āϤāϰ⧇āϰ scope-āĻāϰ āύāĻžāĻŽ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϝāĻŧ āύāĻž, āφāϰ āĻāϟāĻžāχ āĻāĻ•āϟāĻž āύāĻžāĻŽāϕ⧇ private āĻŦāĻžāύāĻžāϝāĻŧāĨ¤
  • Function-āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻž call āĻāĻ•āϟāĻž āύāϤ⧁āύ scope āĻŦāĻžāύāĻžāϝāĻŧ, āϤāĻžāχ function-āĻāϰ āύāĻžāĻŽāϗ⧁āϞ⧋ āĻĒā§āϰāϤāĻŋāϟāĻž call-āĻ āύāϤ⧁āύ āĻ•āϰ⧇ āĻļ⧁āϰ⧁ āĻšāϝāĻŧāĨ¤
  • Closure āĻšāϞ⧋ āĻāĻŽāύ āĻāĻ•āϟāĻž function, āϝ⧇āϟāĻž āϝ⧇ scope-āĻ āϤ⧈āϰāĻŋ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ āϏ⧇āϟāĻž āϧāϰ⧇ āϰāĻžāϖ⧇; counter factory āĻāϟāĻž āĻĻāĻŋāϝāĻŧ⧇āχ āĻĒā§āϰāϤāĻŋāϟāĻž counter-āϕ⧇ āĻāĻ•āϟāĻž private count āĻĻ⧇āϝāĻŧāĨ¤
  • āφāϰāĻ“ āĻ—āĻ­ā§€āϰ⧇: Under the Hood, environment record, V8-āĻāϰ context āφāϰ closure-āĻāϰ memory lab (Pro)āĨ¤

āĻāϰāĻĒāϰ lesson 02 āĻĒā§āϰāϤāĻŋāϟāĻž āύāĻŋāϝāĻŧāĻŽ āĻāĻ•āϟāĻž āĻāĻ•āϟāĻž āĻ•āϰ⧇ āϧāϰāĻŦ⧇: global object, var āφāϰ āĻ“āϰ function scope, shadowing, hoisting āφāϰ dead zoneāĨ¤

lesson ā§§ āĻļ⧇āώ

āĻļ⧇āώ āĻšāϞ⧇ āϚāĻŋāĻšā§āύ āĻĻāĻŋāύ, āĻ…āĻ—ā§āϰāĻ—āϤāĻŋ āφāĻĒāύāĻžāϰ āϏāĻžāĻĨ⧇ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤

āĻĒāϰ⧇āϰāϟāĻž: āĻĒā§āϰāϤāĻŋāϟāĻž āύāĻŋāϝāĻŧāĻŽ, āĻāĻ•āϟāĻž āĻāĻ•āϟāĻž āĻ•āϰ⧇: block, var, hoisting āφāϰ dead zone

āύāĻžāĻŽ āϕ⧋āĻĨāĻžāϝāĻŧ āĻĨāĻžāϕ⧇: scope āφāϰ closure, āĻĒ⧁āϰ⧋ āĻ›āĻŦāĻŋāϟāĻž | Learn JavaScript | Progsity