I want to understand how and when javascript engines pass values to callback functions, I have tried debugging and looking up online but I am unable to find exact answer, consider the following example:
for(var i = 0; i < 4; i++) {
console.log("outside callback " + i + " ");
setTimeout(function test(){
console.log("inside callback " + i + " ");
},100);
}
this prints following output
outside callback 0
outside callback 1
outside callback 2
outside callback 3
inside callback 4
inside callback 4
inside callback 4
inside callback 4
If I just change the declaration of i variable using let keyword as follows:
for(let i = 0; i < 4; i++) {
console.log("outside callback " + i + " ");
setTimeout(function test(){
console.log("inside callback " + i + " ");
},100);
}
It results in the following output:
outside callback 0
outside callback 1
outside callback 2
outside callback 3
inside callback 0
inside callback 1
inside callback 2
inside callback 3
When debugging this in Chrome, it shows i in first example as closure scope for test function and block scope in second example.