var num1 = 1;
var num2 = 2;
var sum = function(){
return num1 + num2;
}
console.log(sum())
āĻāĻŽāϰāĻž āϝāĻĻāĻŋ āĻāĻĒāϰā§āϰ āĻā§āĻĄ āĻā§āϞ⧠āĻĻā§āĻāĻŋ āϤāĻžāĻšāϞ⧠āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§ āϝ⧠num1
āĻāĻŦāĻ num2
function āĻāϰ āĻŦāĻžāĻāϰ⧠āĻāĻā§ āĻāĻŋāύā§āϤ⧠āϤāĻžāϰ āĻĒāϰ āĻ function āĻāϰ āĻāĻŋāϤāϰ āĻĨā§āĻā§ āĻāĻŽāϰāĻž num1 + num2
āĻā§ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻāĻŋāĨ¤ āĻāϰā§āĻĨāĻžā§ āĻāĻŽāϰāĻž parent āĻāϰ āĻāĻŋāύāĻŋāϏ āĻā§āϞāĻžāĻā§ child āĻĨā§āĻā§ excess āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
āĻāĻŋāύā§āϤ⧠āĻāϏāϞ⧠āĻāĻŋāĻāĻžāĻŦā§ āĻāĻāĻāĻž āĻāĻā§?
āĻāĻāĻāĻž āĻāĻā§ closure
āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§āĨ¤
closer parent āĻāϰ āϝā§āϏāĻŦ āĻāĻŋāύāĻŋāϏ āĻā§āϞāĻž child excess āĻāĻžā§ āϏā§āĻ āĻāĻŋāύāĻŋāϏ āĻā§āϞāĻžāϰ āĻāĻāĻāĻž āϰā§āĻĢāĻžāϰā§āύā§āϏ āύāĻŋāĻā§āϰ āĻāĻŋāϤāϰ⧠āϰāĻžāĻā§ āĻāĻŦāĻ child āĻāϰ āĻŽāϧā§āϝ⧠āϏā§āĻ reference āϏāĻš āĻāĻāĻāĻž āĻ
āĻŦā§āĻā§āĻā§āĻ āϤā§āϰāĻŋ āĻšā§ āĻāĻŦāĻ āĻāĻ āĻ
āĻŦā§āĻā§āĻā§āĻā§āϰ āύāĻžāĻŽ āĻšā§ closure
. āύāĻŋāĻā§āϰ āĻā§āĻĄ āĻā§āϞ⧠āϞāĻā§āώ āĻāϰāĻŋāĨ¤
var sum = function(){
var num1 = 1;
var num2 = 2;
return function(){
return num1 + num2;
}
}
var myFunc = sum();
console.dir(myFunc)
āĻāĻ āĻā§āĻĄ āĻā§āϞā§āϰ output āύāĻŋāĻā§āϰ āĻāĻŦāĻŋāϤ⧠āĻĻā§āĻā§āĻž āĻšāϞā§
āĻāĻāĻžāύ⧠sum
function āĻāϰ āĻāĻāĻāĻž anonymous function return āĻāϰāĻā§āĨ¤ āĻāĻ anonymous function return āĻāϰ⧠num1 + num2
. āĻāĻŋāύā§āϤ⧠anonymous function āĻāϰ āĻāĻŋāϤāϰ⧠num1 āĻāϰ num2 āύā§āĻāĨ¤ num1 āĻāϰ num2 āĻāĻā§ āϤāĻžāϰ parent function sum
āĻāϰ āĻāĻŋāϤāϰā§āĨ¤ āĻāĻāύ āĻāĻ anonymous function āĻāĻž āϤāĻžāϰ parent āĻĨā§āĻā§ num1 and num2 āĻāϰ āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻāύ⧠āĻāĻāĻāĻž function āϤā§āϰāĻŋ āĻāϰ⧠āύāĻŋāĻā§āϰ āĻāĻžāĻā§ āϰā§āĻā§ āĻĻā§ā§ āĻāĻā§āĻ closure āĻŦāϞā§āĨ¤ āĻāϰ āϏā§āĻ āĻāύā§āϝāĻ āĻāĻŽāϰāĻž parent āĻāϰ āĻāĻŋāύāĻŋāϏ child āĻ access āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
function bakeAccount(initialBallance) {
var ballance = initialBallance;
return function(){
return ballance;
}
}
var account = bakeAccount(100000);
console.dir(account);
āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž ballance āĻā§ protected way āϤ⧠closure āĻĻāĻŋā§ā§ access āĻāϰāϤ⧠āĻĒāĻžāϰāĻāĻŋ āĻāĻŋāύā§āϤ⧠āϏāϰāĻžāϏāϰāĻŋ āύāĻžāĻšāĨ¤ āĻ āϰā§āĻĨāĻžā§ āĻāĻŽāϰāĻž closure āĻĻāĻŋā§ā§ protected way āϤ⧠āĻā§āύ⧠āĻāĻŋāĻā§ access āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
Closure is a function that refer to independent (free) variable.(variable that are used locally but define in enclosing scope).
āĻāĻāĻāĻžāύ⧠āĻĻā§āĻāϤ⧠āĻĒāĻžāϰāĻāĻŋ āĻĻā§āĻ āĻā§āώā§āϤā§āϰā§āĻ same code āϞā§āĻāĻž āĻšā§ā§āĻā§āĨ¤ āĻāĻŋāύā§āϤā§
let i = 0
āĻāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠var i = 0
āĻĻā§āĻā§āĻž āĻšā§ā§āĻā§āĨ¤ āĻāϰ āϤāĻžāĻ output āĻāϏāϤ⧠āĻāĻŋāύā§āύ āϰāĻāĻŽāĨ¤ let āĻāϰ āĻā§āώā§āϤā§āϰ⧠output āĻāϏāĻā§ 0 1 2
āĻāϰ var āĻāϰ āĻā§āώā§āϤā§āϰ⧠āĻāϏāĻā§ 3 3 3
āĨ¤ āĻāϏāϞ⧠āĻāĻŽāύ āĻā§āύ⧠āĻāϏāϞā§?
āĻāĻŽāύ āĻāϏāĻžāϰ āĻāĻžāϰāύ āĻšāϞ⧠āĻāĻŽāϰāĻž āĻāĻžāύāĻŋ var = i āĻāĻāĻāĻŋ global variable āĻāĻāĻā§āώā§āϤā§āϰ⧠setTimeOut function āĻāĻž āϝā§āĻšā§āϤ⧠3 secound āĻĻā§āϰāĻŋāϤ⧠run āĻāϰāĻā§ āϏā§āĻšā§āϤ⧠loop āĻāĻž āĻāĻā§ āĻāϞ⧠i āĻāϰ āĻŽāĻžāύ āĻŦāĻžāϰ āĻŦāĻžāϰ change āĻšāĻā§āĻā§ āĻāĻŦāĻ āϝāĻāύ āĻ change āĻšāĻā§āĻā§ loop āĻāĻž āĻĻā§āĻāĻā§ āϝ⧠āĻāĻ i āϤ⧠āϏā§āĻ āĻāĻā§āϰ i āϤāĻāύ āĻāĻāĻ i āĻāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ closure āĻ āϤā§āϰāĻŋ āĻšāĻā§āĻā§ āĻāĻŦāĻ āĻāϰ āĻŽāĻžāύ contenously update āĻšā§ā§ 3 āĻšā§ā§ āϝāĻžāĻā§āĻā§āĨ¤ āĻāĻŦāĻ 3 secound āĻĒāϰ 3 āĻāĻž 3 print āĻāϰāĻā§āĨ¤
āĻāĻŋāύā§āϤ let āĻšāϞ⧠block scopeāĨ¤ āϤāĻžāĻ loop āĻāϞāĻžāϰ āϏāĻŽā§ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰā§āϰ i āĻāϰ āĻŽāĻžāύā§āϰ āĻāύā§āϝ āĻāĻāĻāĻž āĻāϰ⧠block scope āϤā§āϰāĻŋ āĻšāĻā§āĻā§āĨ¤ āϤāĻžāĻ setTimeout āĻāϰ function āĻāĻž āϝāĻāύ āϤāĻžāϰ parent āĻāϰ āĻĨā§āĻā§ i āĻā§ access āĻāϰāϤ⧠āϝāĻžā§ āϤāĻāύ āĻĒā§āϰāϤāĻŋāĻāĻž block scope āĻāϰ āĻāύā§āϝ different different closure āϤā§āϰāĻŋ āĻāϰ⧠i āĻāϰ āĻŽāĻžāύāϰ different different reference āϤāĻžāϰ āĻāĻŋāϤāϰ⧠āϰāĻžāĻā§ āϤāĻžāĻ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ different result print āĻāϰā§āĨ¤