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>