for(let i = 0;i<buttons.length;i++){
buttons[i].onclick = function(){
console.log(i);
}
}
Does JS create buttons.length scopes in global scope? Or JS only creates one scope in global?
for(let i = 0;i<buttons.length;i++){
buttons[i].onclick = function(){
console.log(i);
}
}
Does JS create buttons.length scopes in global scope? Or JS only creates one scope in global?
The reason why using let instead of var to define i makes each button, when clicked, to log the correct i is, because let defines i inside the for loop while var defines it outside the loop.
Using let:
var buttons = document.getElementsByTagName("button");
for (let i = 0; i < buttons.length; i++) buttons[i].onclick =()=> console.log(i);
<button>0</button>
<button>1</button>
<button>2</button>
Using var:
var buttons = document.getElementsByTagName("button");
for (var i = 0; i < buttons.length; i++) buttons[i].onclick =()=> console.log(i);
<button>0</button>
<button>1</button>
<button>2</button>
Before let was introduced, one would have to come up with fancy ways to pass i inside the function, such as using an Immediately Invoked Function Expression.
Using an IIFE:
var buttons = document.getElementsByTagName("button");
for(var i = 0; i < buttons.length; i++) {
buttons[i].onclick = (function (i) {
return ()=> console.log(i);
})(i);
}
<button>0</button>
<button>1</button>
<button>2</button>