Module ā§Ŧ ¡ scope, hoisting āĻāϰ closure
āύāĻžāĻŽ āĻā§āĻĨāĻžāϝāĻŧ āĻĨāĻžāĻā§: scope āĻāϰ closure, āĻĒā§āϰ⧠āĻāĻŦāĻŋāĻāĻž
āĻāĻ 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 āĻĻāĻŋāϝāĻŧā§ āĻĨā§āĻŽā§ āϝāĻžāϝāĻŧāĨ¤
āĻŽāĻžāύ⧠āĻā§āϤāϰā§āϰ āĻŦāĻžāĻā§āϏ āϤāĻžāϰ āĻāĻžāϰāĻĒāĻžāĻļā§āϰ āϏāĻŦ āĻŦāĻžāĻā§āϏā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻž āύāĻžāĻŽ āĻĻā§āĻāϤ⧠āĻĒāĻžāϝāĻŧ, āĻāϰ āĻŦāĻžāĻāϰā§āϰ āĻŦāĻžāĻā§āϏ āĻā§āϤāϰā§āϰ āĻŦāĻžāĻā§āϏā§āϰ āĻāĻŋāĻā§āĻ āĻĻā§āĻāϤ⧠āĻĒāĻžāϝāĻŧ āύāĻžāĨ¤ āĻĒāϰā§āϰ 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 āĻŦāĻžāĻĄāĻŧā§āĨ¤
āĻāĻ āϏā§āĻ 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 āĻĒā§āϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻŽāĻžāύ⧠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-āĻāĻžāĻā§ āύāĻŋāĻā§ āĻā§āĻĨāĻžāĻ āĻĨā§āĻā§ āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāϝāĻŧāĨ¤
āϏāĻŦāĻā§āϝāĻŧā§ āĻā§āĻ 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 āĻĻāĻŋāϝāĻŧā§āĨ¤
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 āĻāϰāĻŦā§ āϏāĻŦāĻā§āϝāĻŧā§ āĻā§āĻ āϝ⧠āĻŦāĻžāĻā§āϏ⧠āĻāĻāĻž āϞāĻžāĻā§, āϏā§āĻāĻžāύā§āĨ¤
āϝ⧠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 āĻ
āύā§āϝāĻāĻžāĻā§ āĻā§āĻāϤ⧠āĻĒāĻžāϰ⧠āύāĻžāĨ¤
āĻāĻāĻž āĻā§āĻĨāĻžāϝāĻŧ āĻāĻžāĻā§ āϞāĻžāĻā§
- ReactāĨ¤ āĻāĻāĻāĻž React component āĻāϏāϞ⧠āĻāĻāĻāĻž function, āĻāϰ āĻāϰ
useStatehook āĻĢā§āϰāϤ āĻĻā§āϝāĻŧ 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 āĻŽāύ⧠āĻšāĻŦā§āĨ¤
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 āĻŽāĻŋāύāĻŋāĻā§āϰ āĻĻāĻŋāύ, āĻāϰ āĻāĻŽāύ āĻāĻĄāĻŧ āϝā§āĻāĻž āĻĒā§āϰā§āĻŖāϏāĻāĻā§āϝāĻž āύāĻžāĨ¤
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āĨ¤
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 CompilerDavid-āĻāϰ 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 āĻĻāĻŋāϝāĻŧā§ āĻāĻžāϞāĻžāĻāĨ¤
āϏāĻāϰāĻžāĻāϰ āϝ⧠āĻĒā§āϰāĻļā§āύāĻā§āϞ⧠āĻāϏā§
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-āĻ āĻāĻāĻŦāĻžāϰāĨ¤ticketcall āĻāϰāϞ⧠āĻāϞ⧠āĻļā§āϧ⧠āĻā§āϤāϰā§āϰ 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