Created
April 14, 2020 22:04
-
-
Save sagarjhaa/7907d2dc51ad3a2c53b2666460f283fb to your computer and use it in GitHub Desktop.
Gist on understanding closures - Javascript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// http://csbin.io/closures | |
// Type JavaScript here and click "Run Code" or press Ctrl + s | |
console.log('Hello, world!'); | |
// CHALLENGE 1 | |
function createFunction() { | |
return function(){ | |
console.log('hello'); | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const function1 = createFunction(); | |
function1(); // => should console.log('hello'); | |
// CHALLENGE 2 | |
function createFunctionPrinter(input) { | |
return function(){ | |
console.log(input); | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const printSample = createFunctionPrinter('sample'); | |
printSample(); // => should console.log('sample'); | |
const printHello = createFunctionPrinter('hello'); | |
printHello(); // => should console.log('hello'); | |
// CHALLENGE 3 | |
function outer() { | |
let counter = 0; // this variable is outside incrementCounter's scope | |
function incrementCounter () { | |
counter ++; | |
console.log('counter', counter); | |
} | |
return incrementCounter; | |
} | |
const willCounter = outer(); | |
const jasCounter = outer(); | |
// Uncomment each of these lines one by one. | |
// Before your do, guess what will be logged from each function call. | |
// /*** Uncomment these to check your work! ***/ | |
willCounter(); // 1 | |
willCounter(); // 2 | |
willCounter(); // 3 | |
jasCounter(); // 1 | |
willCounter(); // 4 | |
function addByX(x) { | |
return function(y){ | |
return x+y; | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const addByTwo = addByX(2); | |
addByTwo(1); // => should return 3 | |
addByTwo(2); // => should return 4 | |
addByTwo(3); // => should return 5 | |
const addByThree = addByX(3); | |
addByThree(1); // => should return 4 | |
addByThree(2); // => should return 5 | |
const addByFour = addByX(4); | |
addByFour(4); // => should return 8 | |
addByFour(5); // => should return 9 | |
// CHALLENGE 4 | |
function once(func) { | |
var counter = 0; | |
var output = 0; | |
return function(num){ | |
if (counter == 0){ | |
counter++; | |
output = func(num) | |
} | |
return output; | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const onceFunc = once(addByTwo); | |
console.log(onceFunc(4)); // => should log 6 | |
console.log(onceFunc(10)); // => should log 6 | |
console.log(onceFunc(9001)); // => should log 6 | |
// CHALLENGE 5 | |
function after(count, func) { | |
var counter = 1; | |
return function(){ | |
if (counter >= count){ | |
func() | |
} | |
else{ | |
counter++; | |
} | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
console.log('------------------'); | |
const called = function() { console.log('hello') }; | |
const afterCalled = after(3, called); | |
afterCalled(); // => nothing is printed | |
afterCalled(); // => nothing is printed | |
afterCalled(); // => 'hello' is printed | |
// CHALLENGE 6 | |
function delay(func, wait) { | |
setTimeout(func(),wait); | |
} | |
// CHALLENGE 7 | |
function rollCall(names) { | |
var count = 0; | |
return function (){ | |
if (count < names.length){ | |
console.log(names[count]); | |
count++ | |
} | |
else{ | |
console.log("Everyone account for") | |
} | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const rollCaller = rollCall(['Victoria', 'Juan', 'Ruth']) | |
rollCaller() // => should log 'Victoria' | |
rollCaller() // => should log 'Juan' | |
rollCaller() // => should log 'Ruth' | |
rollCaller() // => should log 'Everyone accounted for' | |
// CHALLENGE 8 | |
function saveOutput(func, magicWord) { | |
var obj = {}; | |
var output; | |
return function(arg){ | |
if (arg != magicWord){ | |
output = func(arg); | |
obj[arg] = output; | |
return output; | |
} | |
else{ | |
return obj; | |
} | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const multiplyBy2 = function(num) { return num * 2; }; | |
const multBy2AndLog = saveOutput(multiplyBy2, 'boo'); | |
console.log(multBy2AndLog(2)); // => should log 4 | |
console.log(multBy2AndLog(9)); // => should log 18 | |
console.log(multBy2AndLog('boo')); // => should log { 2: 4, 9: 18 } | |
// CHALLENGE 9 | |
function cycleIterator(array) { | |
var count = -1; | |
return function(){ | |
if (count+1 < array.length){ | |
count++; | |
return array[count] | |
} | |
else{ | |
count = 0; | |
return array[count]; | |
} | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const threeDayWeekend = ['Fri', 'Sat', 'Sun']; | |
const getDay = cycleIterator(threeDayWeekend); | |
console.log(getDay()); // => should log 'Fri' | |
console.log(getDay()); // => should log 'Sat' | |
console.log(getDay()); // => should log 'Sun' | |
console.log(getDay()); // => should log 'Fri' | |
// CHALLENGE 10 | |
function defineFirstArg(func, arg) { | |
return function(second){ | |
return func(arg,second); | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const subtract = function(big, small) { return big - small; }; | |
const subFrom20 = defineFirstArg(subtract, 20); | |
console.log(subFrom20(5)); // => should log 15 | |
// CHALLENGE 11 | |
function dateStamp(func) { | |
return function(){ | |
var today = new Date(); | |
today = today.getFullYear()+'-'+(today.getMonth()+1)+'-'+today.getDate(); | |
return { | |
date: today, | |
output: func(arguments[0]) | |
} | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const stampedMultBy2 = dateStamp(n => n * 2); | |
console.log(stampedMultBy2(4)); // => should log { date: (today's date), output: 8 } | |
console.log(stampedMultBy2(6)); // => should log { date: (today's date), output: 12 } | |
// CHALLENGE 12 | |
function censor() { | |
var d = {} | |
return function(first,second=null){ | |
if (second != null){ | |
d[first] = second | |
console.log(d); | |
} | |
else{ | |
for(let key in d){ | |
first = first.replace(key,d[key]) | |
} | |
return first | |
} | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const changeScene = censor(); | |
changeScene('dogs', 'cats'); | |
changeScene('quick', 'slow'); | |
console.log(changeScene('The quick, brown fox jumps over the lazy dogs.')); // => should log 'The slow, brown fox jumps over the lazy cats.' | |
// CHALLENGE 13 | |
function createSecretHolder(secret) { | |
let mysecret = secret; | |
return { | |
getSecret: () => console.log(mysecret), | |
setSecret: (value) => mysecret = value | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
let obj = createSecretHolder(5) | |
obj.getSecret() // => returns 5 | |
obj.setSecret(2) | |
obj.getSecret() // => returns 2 | |
// CHALLENGE 14 | |
function callTimes() { | |
var count = 1; | |
return function(){ | |
return console.log(count++); | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
let myNewFunc1 = callTimes(); | |
let myNewFunc2 = callTimes(); | |
myNewFunc1(); // => 1 | |
myNewFunc1(); // => 2 | |
myNewFunc2(); // => 1 | |
myNewFunc2(); // => 2 | |
// CHALLENGE 15 | |
function russianRoulette(num) { | |
var count = 0; | |
return function(){ | |
count++; | |
if (count < num){ | |
return 'click'; | |
} | |
else if (count == num){ | |
return 'bang'; | |
} | |
else{ | |
return 'reload to play again' | |
} | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const play = russianRoulette(3); | |
console.log(play()); // => should log 'click' | |
console.log(play()); // => should log 'click' | |
console.log(play()); // => should log 'bang' | |
console.log(play()); // => should log 'reload to play again' | |
console.log(play()); // => should log 'reload to play again' | |
// CHALLENGE 16 | |
function average() { | |
var average = 0; | |
var count = 0; | |
return function(num=null){ | |
if (num != null){ | |
let total = (average*count) + num; | |
count++; | |
average = total/count; | |
} | |
return average; | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const avgSoFar = average(); | |
console.log(avgSoFar()); // => should log 0 | |
console.log(avgSoFar(4)); // => should log 4 | |
console.log(avgSoFar(8)); // => should log 6 | |
console.log(avgSoFar()); // => should log 6 | |
console.log(avgSoFar(12)); // => should log 8 | |
console.log(avgSoFar()); // => should log 8 | |
// CHALLENGE 17 | |
function makeFuncTester(arrOfTests) { | |
var array = [...arrOfTests]; | |
return function(callback){ | |
return array.every((value) => value[1] == callback(value[0])) | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const capLastTestCases = []; | |
capLastTestCases.push(['hello', 'hellO']); | |
capLastTestCases.push(['goodbye', 'goodbyE']); | |
capLastTestCases.push(['howdy', 'howdY']); | |
const shouldCapitalizeLast = makeFuncTester(capLastTestCases); | |
const capLastAttempt1 = str => str.toUpperCase(); | |
const capLastAttempt2 = str => str.slice(0, -1) + str.slice(-1).toUpperCase(); | |
console.log(shouldCapitalizeLast(capLastAttempt1)); // => should log false | |
console.log(shouldCapitalizeLast(capLastAttempt2)); // => should log true | |
// CHALLENGE 18 | |
function makeHistory(limit) { | |
var storage = [] | |
return function(value){ | |
if (value == 'undo'){ | |
if (storage.length == 0){ | |
return 'nothing to undo'; | |
} | |
else{ | |
return storage.pop() + ' undone'; | |
} | |
} | |
else{ | |
storage.push(value) | |
if (storage.length > limit){ | |
storage.shift(); | |
} | |
return value + ' done'; | |
} | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
const myActions = makeHistory(2); | |
console.log(myActions('jump')); // => should log 'jump done' | |
console.log(myActions('undo')); // => should log 'jump undone' | |
console.log(myActions('walk')); // => should log 'walk done' | |
console.log(myActions('code')); // => should log 'code done' | |
console.log(myActions('pose')); // => should log 'pose done' | |
console.log(myActions('undo')); // => should log 'pose undone' | |
console.log(myActions('undo')); // => should log 'code undone' | |
console.log(myActions('undo')); // => should log 'nothing to undo' | |
// CHALLENGE 19 | |
function blackjack(array) { | |
var index = 0; | |
return function(num1,num2){ | |
var count = 0; | |
var currentTotal = 0; | |
return function(){ | |
if (count == 0){ | |
count++; | |
currentTotal = num1+num2; | |
return num1 + num2; | |
} | |
else if(currentTotal > 21){ | |
return 'you are done!'; | |
} | |
else{ | |
currentTotal+=array[index] | |
index++; | |
if (currentTotal > 21){ | |
return 'bust'; | |
} | |
else{ | |
return currentTotal; | |
} | |
} | |
} | |
} | |
} | |
// /*** Uncomment these to check your work! ***/ | |
/*** DEALER ***/ | |
const deal = blackjack([2, 6, 1, 7, 11, 4, 6, 3, 9, 8, 9, 3, 10, 4, 5, 3, 7, 4, 9, 6, 10, 11]); | |
/*** PLAYER 1 ***/ | |
const i_like_to_live_dangerously = deal(4, 5); | |
console.log(i_like_to_live_dangerously()); // => should log 9 | |
console.log(i_like_to_live_dangerously()); // => should log 11 | |
console.log(i_like_to_live_dangerously()); // => should log 17 | |
console.log(i_like_to_live_dangerously()); // => should log 18 | |
console.log(i_like_to_live_dangerously()); // => should log 'bust' | |
console.log(i_like_to_live_dangerously()); // => should log 'you are done!' | |
console.log(i_like_to_live_dangerously()); // => should log 'you are done!' | |
// /*** BELOW LINES ARE FOR THE BONUS ***/ | |
// /*** PLAYER 2 ***/ | |
const i_TOO_like_to_live_dangerously = deal(2, 2); | |
console.log(i_TOO_like_to_live_dangerously()); // => should log 4 | |
console.log(i_TOO_like_to_live_dangerously()); // => should log 15 | |
console.log(i_TOO_like_to_live_dangerously()); // => should log 19 | |
console.log(i_TOO_like_to_live_dangerously()); // => should log 'bust' | |
console.log(i_TOO_like_to_live_dangerously()); // => should log 'you are done! | |
console.log(i_TOO_like_to_live_dangerously()); // => should log 'you are done! | |
// // /*** PLAYER 3 ***/ | |
const i_ALSO_like_to_live_dangerously = deal(3, 7); | |
console.log(i_ALSO_like_to_live_dangerously()); // => should log 10 | |
console.log(i_ALSO_like_to_live_dangerously()); // => should log 13 | |
console.log(i_ALSO_like_to_live_dangerously()); // => should log 'bust' | |
console.log(i_ALSO_like_to_live_dangerously()); // => should log 'you are done! | |
console.log(i_ALSO_like_to_live_dangerously()); // => should log 'you are done! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment