Just came across the following in a recent question I was looking at, and I'm curious as to why var name
and const name
offer varying outputs. Run the snippets below to see what I mean.
If it has anything to do with name
being a window
object property, then re-declaring/defining name
with const
should result in an error I would think. However, in the example(s) below, const
allows for the re-declaration of name
as an array, while var
does not.
var name = ['one', 'two', 'three', 'four', 'five'];
for (var i=0; i < name.length; i++){
document.write(name[i] + '<br>');
}
const name = ['one', 'two', 'three', 'four', 'five'];
for (var i=0; i < name.length; i++){
document.write(name[i] + '<br>');
}
So, why does const
allow me to hijack the window.name
property and reassign it as an array? But var
does not allow for the reassignment (remains as default string
)? Or am I simply looking at it the wrong way?
Because const
, like let
, is lexically scoped, and the top-level lexical scope is not the same as global scope. Here's an analogy:
function f(){
var name = 1;
{
var name = 2; // does not create a new variable, because name already exists at the top level of the function
}
console.log(name); // 2
}
function g(){
var name = 1;
{
const name = 2; // creates a new variable
}
console.log(name); // 1
}
const
isn't hijacking window.name
; it's just shadowing it. You can see this by observing in your second case that window.name
remains unchanged. You can think of top-level code as if it's within the nested block in the functions above: var
declarations get put in the global scope, but let
and const
declarations do not.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With